使用「以宣告方式傳送 LDAP 屬性」規則的時機

當您想要發出連出宣告,而它包含存在於屬性存放區的實際輕量型目錄存取通訊協定 (LDAP) 屬性值,然後將宣告類型與每一個 LDAP 屬性產生關聯時,您可以在 Active Directory 同盟服務 (AD FS) 中使用此規則。 如需屬性存放區的詳細資訊,請參閱屬性存放區的角色

使用這項規則時,您需要對您指定且符合規則邏輯的每一個 LDAP 屬性發出宣告,如下表所述。

規則選項 規則邏輯
LDAP 屬性與傳出宣告類型的對應 如果屬性存放區等於指定的屬性存放區,且 LDAP 屬性等於指定的值,則將 LDAP 屬性值對應至指定的連出宣告類型,並發出宣告。

下列各節提供宣告規則的基本介紹。 另還針對「以宣告方式傳送 LDAP 屬性」規則的時機提供詳細資料。

關於宣告規則

宣告規則表示商務邏輯的執行個體,將會收取傳入宣告,對其套用條件 (若 x 則 y),然後根據條件參數產生傳出宣告。 在您進一步閱讀本主題之前,請先閱讀下列清單,其中會概述關於宣告規則您應該知道的重要秘訣:

  • 在 AD FS 管理嵌入式管理單元中,只能使用宣告規則範本建立宣告規則

  • 宣告規則會從宣告提供者 (例如 Active Directory 或其他同盟服務) 直接處理傳入宣告,或是在宣告提供者信任上從接受轉換規則的輸出處理傳入宣告。

  • 宣告規則的處理方式,是由宣告發行引擎依時間先後順序按照指定的規則集處理。 藉由設定規則優先順序,您可以進一步精簡或篩選由特定規則集內的上一個規則所產生的宣告。

  • 宣告規則範本一律會要求您指定傳入宣告類型。 不過,您可以使用單一規則和同一宣告類型處理多個宣告值。

如需宣告規則和宣告規則集的詳細資訊,請參閱宣告規則的角色。 如需如何處理規則的詳細資訊,請參閱宣告引擎的角色。 如需如何處理宣告規則集的詳細資訊,請參閱宣告管線的角色

LDAP 屬性與傳出宣告類型的對應

當您使用「以宣告形式傳送 LDAP 屬性」規則範本時,您可以從 LDAP 屬性存放區選取屬性,例如 Active Directory 或 Active Directory 網域服務 (AD DS),以宣告方式將值傳送給信賴憑證者。 這實際上會從您定義的屬性存放區中,將特定的 LDAP 屬性對應至一組可用於授權的連出宣告。

使用這個範本時,您可以從單一規則新增多個屬性,這些屬性將以多個宣告的方式傳送。 比方說,您可以使用這個規則範本建立規則,此規則會從 companydepartment Active Directory 屬性中,查詢已驗證的使用者的屬性值,然後以兩個不同連出宣告的方式傳送這些值。

您也可以使用此規則來傳送使用者的所有群組成員資格。 如果您只想要傳送個別的群組成員資格,請使用「以宣告方式傳送群組成員資格」規則範本。 如需詳細資訊,請參閱 When to Use a Send Group Membership as a Claim Rule

如何建立此規則

您可以使用宣告規則語言,或使用 AD FS 管理嵌入式管理單元中的「以宣告方式傳送 LDAP 屬性」規則範本建立這項規則。 這個規則範本提供下列設定選項:

  • 指定宣告規則名稱

  • 選取要從中擷取 LDAP 屬性的屬性存放區

  • LDAP 屬性與傳出宣告類型的對應

如需如何建立此規則的詳細資訊,請參閱建立規則以傳送 LDAP 屬性作為宣告

使用宣告規則語言

如果查詢 Active Directory、AD DS 或 Active Directory 輕量型目錄服務 (AD LDS) 必須與 samAccountname 以外的 LDAP 屬性做比較,您必須改用自訂規則。 如果沒有輸入集中沒有 Windows 帳戶名稱宣告,您也必須使用自訂規則指定要用於查詢 AD DS 或 AD LDS 的宣告。

下列範例協助您了解有各種方式可讓您使用宣告規則語言建構自訂規則,以查詢及擷取屬性存放區中的資料。

範例:如何查詢 AD LDS 屬性存放區並傳回指定的值

參數必須以分號分隔。 第一個參數是 LDAP 篩選器。 後續參數是在任何相符物件上要傳回的屬性。

下列範例示範如何依 sAMAccountName 屬性查詢使用者,然後利用使用者的 mail 屬性值,發出電子郵件地址宣告:

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> issue(store = "AD LDS", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"), query = "sAMAccountName={0};mail", param = regexreplace(c.Value, "(?<domain>[^\\]+)\\(?<user>.+)", "${user}"));

下列範例示範如何依 mail 屬性查詢使用者,然後利用使用者的 titledisplayname 屬性值,發出職稱和顯示名稱宣告:

c:[Type == " http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress ", Issuer == "AD AUTHORITY"]
=> issue(store = "AD LDS ", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/title","http://schemas.xmlsoap.org/ws/2005/05/identity/claims/displayname"), query = "mail={0};title;displayname", param = c.Value);

下列範例示範如何依 mail 和 title 查詢使用者,然後利用使用者的 displayname 屬性,發出顯示名稱宣告:

c1:[Type == " http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"] && c2:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/title"]
=> issue(store = "AD LDS ", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/displayname"), query = "(&(mail={0})(title={1}));displayname", param = c1.Value, param = c2.Value);

範例:如何查詢 Active Directory 屬性存放區並傳回指定的值

Active Directory 查詢必須包含使用者的名稱 (含網域名稱) 做為最後一個參數,Active Directory 屬性存放區才能查詢正確的網域。 否則支援相同的語法。

下列範例示範如何依用者網域中的 sAMAccountName 屬性查詢使用者,然後傳回 mail 屬性:

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"), query = "sAMAccountName={0};mail;{1}", param = regexreplace(c.Value, "(?<domain>[^\\]+)\\(?<user>.+)", "${user}"), param = 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)

上一個查詢是由下列三個部分所組成:

  • LDAP 篩選器 — 指定這個查詢部分是為了擷取您想要查詢屬性的物件。 如需有效 LDAP 查詢的一般資訊,請參閱 RFC 2254。 當您查詢 Active Directory 屬性存放區且未指定 LDAP 篩選時,會假定為 samAccountName={0} 查詢,且 Active Directory 屬性存放區需要參數來提供 {0} 的值。 否則,查詢會產生錯誤。 對於 Active Directory 以外的 LDAP 屬性存放區,您不能省略查詢的 LDAP 篩選器部分,否則查詢會產生錯誤。

  • 屬性規格 — 在查詢的第二個部分中,您可以指定想要從篩選的物件中取得的屬性 (如果使用多個屬性值,則以逗點分隔)。 您指定的屬性數目必須符合您在查詢中定義的宣告類型數目。

  • Active Directory 網域 — 只有當屬性存放區是 Active Directory 時,才需要指定查詢的最後一部分 (查詢其他屬性存放區時不需要此部分)。查詢的這個部分以「網址\名稱」格式指定使用者帳戶。 Active Directory 屬性存放區使用「網域」部分來決定要連接的適當網域控制站,然後執行查詢和要求屬性。

範例:如何使用兩個自訂規則來從 Active Directory 中的屬性擷取管理員電子郵件

下列兩個自訂規則 (依下面顯示的順序一起使用時) 會向 Active Directory 查詢使用者帳戶的 manager 屬性 (規則 1),然後使用該屬性來查詢管理員使用者帳戶的 mail 屬性 (規則 2)。 最後,以 "ManagerEmail" 宣告方式發出 mail 屬性。 總而言之,規則 1 會查詢 Active Directory,並將查詢的結果傳遞至規則 2,規則 2 再擷取管理員電子郵件值。

例如,這些規則執行完成時會發出宣告,其中包含 corp.fabrikam.com 網域中某個使用者的管理員電子郵件地址。

規則 1

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
=> add(store = "Active Directory", types = ("http://schemas.xmlsoap.org/claims/ManagerDistinguishedName"), query = "sAMAccountName=
{0};mail,userPrincipalName,extensionAttribute5,manager,department,extensionAttribute2,cn;{1}", param = regexreplace(c.Value, "(?
<domain>[^\\]+)\\(?<user>.+)", "${user}"), param = c.Value);

規則 2

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
&& c1:[Type == "http://schemas.xmlsoap.org/claims/ManagerDistinguishedName"]
=> issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/claims/ManagerEmail"), query = "distinguishedName={0};mail;{1}", param = c1.Value,
param = regexreplace(c1.Value, ".*DC=(?<domain>.+),DC=corp,DC=fabrikam,DC=com", "${domain}\username"));

注意

只有當使用者的管理員也位於該使用者的相同網域時 (在本例中為 corp.fabrikam.com),這些規則才有作用。

其他參考

建立規則以宣告方式傳送 LDAP 屬性