Active Directory 同盟服務 (AD FS) 宣告規則語言可作為傳入和傳出宣告行為的系統管理建置組塊,而宣告引擎則做為定義自定義規則之宣告規則語言中邏輯的處理引擎。 如需宣告引擎如何處理所有規則的詳細資訊,請參閱 宣告引擎的角色。
使用宣告規則語言建立自定義宣告規則
AD FS 可讓系統管理員選擇定義自定義規則,這些規則可用來使用宣告規則語言來判斷身分識別宣告的行為。 您可以使用本主題中的宣告規則語言語法範例來建立自定義規則,以列舉、新增、刪除和修改宣告,以符合組織的需求。 您可以在 使用「以自訂宣告傳送宣告」 規則範本中,輸入宣告規則語言語法,以建置自訂規則。
規則會以分號彼此分隔。
如需何時使用自訂規則的詳細資訊,請參閱 何時使用自訂宣告規則。
使用宣告規則範本來瞭解宣告規則語言語法
AD FS 也提供一組預先定義的宣告發行和宣告接受規則範本,可供您用來實作一般宣告規則。 在指定信任的 [編輯宣告規則] 對話框中,您可以按一下該規則的 [檢視規則語言] 索引標籤,以查看構成該規則的宣告規則語言語法,並建立預定義規則。 使用本節中的資訊和 檢視規則語言 技術,可讓您深入瞭解如何建構自己的自定義規則。
如需宣告規則和宣告規則範本的詳細資訊,請參閱 宣告規則的角色。
了解宣告規則語言的組成部分
宣告規則語言包含下列元件,並以 “ =>” 運算子分隔:
條件
發行聲明
條件
您可以使用規則中的條件來檢查輸入宣告,以決定是否執行規則的執行敘述。 條件代表必須評估為 true 才能執行規則主體元件的邏輯表達式。 如果遺漏此部分,則會假設邏輯上為真,即規則的內容將始終被執行。 條件部分包含條件清單,這些條件會與結合邏輯運算符 (“&&” ) 結合在一起。 清單中的所有條件都必須評估為 true,才能將整個條件元件評估為 true。 條件可以是宣告選擇運算子或聚合函數呼叫。 這兩者互斥,這表示宣告選取器和聚合函數無法在單一規則條件元件中合併。
條件在規則中是選擇性的。 例如,下列規則沒有條件:
=> issue(type = "http://test/role", value = "employee");
條件有三種類型:
單一條件 -- 這是最簡單的條件形式。 只會針對一個表達式進行檢查;例如,Windows 帳戶名稱 = 網域使用者。
多重條件— 此條件需要額外的檢查來處理規則主體中的多個表達式;例如,Windows 帳戶名稱 = 網域使用者和群組 = contosopurchasers。
備註
另一個條件存在,但它是單一條件或多個條件的子集。 它稱為正則表示式 (Regex) 條件。 它用來取得輸入表示式,並將表達式與指定的模式比對。 以下顯示如何使用它的範例。
下列範例顯示一些以條件類型為基礎的語法建構,可用來建立自定義規則。
單一條件範例
下表說明單一 -expression 條件。 它們的設計目的是簡單地檢查具有指定宣告類型的宣告,或具有指定宣告類型和宣告值的宣告。
條件描述 | 條件語法範例 |
---|---|
此規則具有一個檢查條件,用於檢查具有指定類型(“<http://test/name >”)的輸入要求。 如果相符宣告位於輸入宣告中,規則會將相符的宣告或宣告複製到輸出宣告集。 |
c: [type == "http://test/name"] => issue(claim = c ); |
此規則有條件可用來檢查具指定宣告類型的輸入宣告(「<http://test/name >」)和宣告值(「Terry」)。 如果相符宣告位於輸入宣告中,規則會將相符的宣告或宣告複製到輸出宣告集。 |
c: [type == "http://test/name", value == "Terry"] => issue(claim = c); |
下一節會顯示更多 -complex 條件,包括檢查多個宣告的條件、檢查宣告簽發者的條件,以及檢查符合正則表達式模式的值的條件。
多個 -condition 範例
下表提供多個 -expression 條件的範例。
條件描述 | 條件語法範例 |
---|---|
此規則具有條件,可以檢查兩個輸入宣告,每個都有指定的宣告類型(“<http://test/name >”和“<http://test/email >”)。 如果兩個相符宣告位於輸入宣告中,規則會將名稱宣告複製到輸出宣告集。 |
c1: [type == "http://test/name"] && c2: [type == "http://test/email"] => issue (claim = c1 ); |
一般狀態範例
下表提供正則表示式 -based 條件的範例。
條件描述 | 條件語法範例 |
---|---|
此規則的條件是使用正則表達式來檢查 e -mail 宣告是否以「@fabrikam.com」結尾。 如果在輸入宣告中找到相符宣告,規則會將比對宣告複製到輸出宣告集。 | c: [type == "http://test/email", value =~ "^. +@fabrikam.com$" ] => issue (claim = c ); |
發行聲明
自訂規則是根據您在宣告規則中編程的發行語句(發行 或 新增)來處理的。 視所需的結果而定,問題語句或 add 語句都可以寫入規則,以填入輸入宣告集或輸出宣告集。 使用 add 語句的自訂規則只會將宣告值明確填入輸入宣告集,而使用問題語句的自定義宣告規則會在輸入宣告集和輸出宣告集中填入宣告值。 當宣告值只供宣告規則集中的未來規則使用時,這非常有用。
例如,在下圖中,傳入宣告會被新增到宣告發行引擎的輸入宣告集。 當第一個自定義宣告規則執行且滿足網域使用者的準則時,宣告發行引擎會使用 add 語句處理規則中的邏輯,並將 Editor 的值新增至輸入宣告集。 由於編輯器的值存在於輸入宣告集中,因此規則 2 可以在其邏輯中成功處理問題語句,併產生新的 Hello值,這會新增至輸出宣告集和輸入宣告集,以供規則集中的下一個規則使用。 規則 3 現在可以使用輸入宣告集中的所有值作為處理其邏輯的輸入。
索賠發行動作
規則主體表示索賠發行行為。 語言識別的聲明發佈動作有兩個:
Issue 語句: issue 語句會建立同時傳送至輸入和輸出宣告集的宣告。 例如,下列語句會根據其輸入宣告集發出新的宣告:
c:[type == "Name"] => issue(type = "Greeting", value = "Hello " + c.value);
新增語句: 新增語句會建立只新增至輸入宣告集集合的新宣告。 例如,下列語句會將新的宣告新增至輸入宣告集:
c:[type == "Name", value == "domain user"] => add(type = "Role", value = "Editor");
規則的發佈聲明會定義當條件符合時,規則將會發出哪些宣告。 關於參數和語句行為的陳述語句有兩種形式:
Normal— 一般發行語句可以使用規則中的常值或符合條件之宣告的值來發出宣告。 一般發行語句可以包含下列其中一種或兩種格式:
宣告複製:宣告複本會在輸出宣告集中建立現有宣告的複本。 此發行表單只有在與發行聲明結合時才有意義。 當它與 「add」 發行語句結合時,它沒有任何作用。
新的宣告:此格式會建立新的宣告,並指定各種宣告屬性的值。 必須指定 Claim.Type;所有其他宣告屬性都是選擇性的。 忽略此表單的參數順序。
屬性存放區— 此窗體會建立宣告,其中包含從屬性存放區擷取的值。 您可以使用單一發行語句來建立多個宣告類型,這對於在屬性擷取期間進行網路或磁碟輸入/輸出 (I/O) 作業的屬性存放區很重要。 因此,建議您限制原則引擎與屬性存放區之間的來回行程數目。 ** 為某一索賠類型建立多個索賠也是合法的。 當屬性存放區傳回指定宣告類型的多個值時,發行語句會自動為每個傳回的宣告值建立宣告。 屬性存放區的實作會使用參數將查詢參數中的佔位符替換為在參數中提供的值。 佔位符使用與 .NET String.Format() 函式相同的語法(例如,{1}、{2}等等)。 引數的順序對這種發行形式很重要,而且必須是以下文法中規定的順序。
下表描述宣告規則中這兩種發佈語句類型的一些常見語法建構。
發行聲明類型 | 發行說明描述 | 發行語句語法範例 |
---|---|---|
正常 | 每當使用者具有指定的宣告類型和值時,下列規則一律會發出相同的宣告: | c: [type == "http://test/employee", value == "true"] => issue (type = "http://test/role", value = "employee"); |
正常 | 下列規則會將一個宣告類型轉換成另一個宣告類型。 請注意,在發行聲明中使用符合條件「c」的宣告值。 | c: [type == "http://test/group" ] => issue (type = "http://test/role", value = c.Value ); |
屬性儲存庫 | 下列規則會使用傳入宣告的值來查詢 Active Directory 屬性存放區: | c: [Type == "http://test/name" ] => issue (store = "Enterprise AD Attribute Store", types = ("http://test/email" ), query = ";mail;{0}", param = c.Value ) |
屬性儲存庫 | 下列規則會使用連入宣告的值來查詢先前設定的結構化查詢語言 (SQL) 屬性存放區: | c: [type == "http://test/name"] => issue (store = "Custom SQL store", types = ("http://test/email","http://test/displayname" ), query = "SELECT mail, displayname FROM users WHERE name ={0}", param = c.value ); |
表達式
表達式會用於宣告選擇器約束和發行語句參數的右側。 語言支援的各種表達式。 語言中的所有表達式都是以字串為基礎,這表示它們接受字串做為輸入併產生字串。 不支援表達式中的數位或其他數據類型,例如日期/時間。 以下是語言支援的表示式類別:
字串常值:字串值,以兩側的引號 (“ ) 字元分隔。
表達式的字串串連:結果是由左右值串連所產生的字串。
函數調用:函式是由標識符所識別,參數會以逗號 -delimited 括弧 (“ ( )” 括住的運算式清單傳遞。
要求的屬性存取以變數名稱 DOT 屬性名稱的形式呈現:根據指定變數值計算所得的要求屬性值。 變數必須先綁定至宣告選擇器,才能以這種方式使用。 在相同宣告選取器的約束條件中使用與其系結的宣告選取器變數是違法的。
下列宣告屬性可供存取:
索賠.類型
聲明.值
索賠.發行者
原索賠.原發行者
要求.值類型
Claim.Properties[property_name] (如果在宣告的屬性集合中找不到屬性_name,則此屬性會傳回空字串。
您可以使用 RegexReplace 函數在表示式內呼叫。 此函式會採用輸入表示式,並將它與指定的模式相符。 如果模式相符,則匹配結果會被替換為新的值。
存在函式
Exists 函式可用於條件中,以評估輸入宣告集中是否存在符合條件的宣告。 如果有任何相符的宣告存在,則只會呼叫發行指令一次。 有「MSFT」簽發者來源的宣告在下列範例中會被發出一次——如果輸入的宣告集集合中至少有一個宣告的簽發者為「MSFT」,不論有多少宣告的簽發者為「MSFT」,「來源」宣告會精確發出一次。 使用此函式可防止發出重複的宣告。
exists([issuer == "MSFT"])
=> issue(type = "origin", value = "Microsoft");
規則主體
規則主體只能包含單一發佈語句。 如果使用條件而不使用 Exists 函式,則每次符合條件部分時,都會執行規則主體一次。