AD FS 2.0 工具
4.58/5 (5投票s)
AD FS 2.0 工具 - 将 Relying Party 数据导出到 XML,从 XML 创建 Relying Party
引言
本文档介绍了在具有多个环境中的多个 AD FS 2.0 联合服务器的大型 AD FS 2.0 部署中可能遇到的两个不同问题。
- 创建 Relying Party - 使用向导创建 Relying Party 可能很麻烦且耗时。拥有一个工具可以方便地将 Relying Party 定义(例如名称、标识符、SAML 终结点等)导出到 XML 文件中。该 XML 文件可用于在另一台服务器(在另一个环境中)上创建 Relying Party 信任或修改现有 Relying Party 的参数。
- 在事件日志中搜索活动 ID - 查找具有特定活动 ID 的事件日志条目可能很麻烦且耗时。拥有一个工具可以方便地搜索多个服务器上的 AD FS 2.0 管理员事件日志,以查找具有特定活动 ID 的事件日志条目。
1. 创建 Relying Party
在作为大型部署中的身份提供者(Identity Provider)的 AD FS 2.0 中,需要执行一些常见的任务,这些任务涉及数十个(或数百个)Relying Party。
- 在一台服务器上创建与另一台服务器上已定义的 Relying Party 相同的 Relying Party(例如,在不同的环境,如测试和生产环境)
- 创建与现有 Relying Party 类似的新的 Relying Party
- 备份 Relying Party 定义
在 AD FS 2.0 中,可以通过多种方式创建 Relying Party。
- 导入在线或本地网络上发布的关于 Relying Party 的数据
- 从文件导入关于 Relying Party 的数据
- 手动输入关于 Relying Party 的数据
以上所有三种方式对于前面提到的常见任务都不够方便。
AD FS 工具提供了三个控制台应用程序:GetRelyingParty、AddRelyingParty 和 UpdateRelyingParty。这些控制台应用程序必须在(主)AD FS 2.0 联合服务器上执行。
GetRelyingParty
GetRelyingParty 以 AD FS Relying Party 的名称作为参数,并在执行它的文件夹中生成一个与 Relying Party 名称同名的 XML 文件。例如,语句...
GetRelyingParty "salesforce test"
...会生成一个名为 _salesforce test.xml_ 的 XML 文件。该 XML 文件包含在另一台服务器上创建相同 Relying Party 所需的信息。该 XML 文件可以用作创建类似 Relying Party 的基础。XML 文件中存储的 Relying Party 属性包括:
名称标识符SamlEndpointsWsFedEndpointAutoUpdateEnabledMonitoringEnabledMetadataUrlSignatureAlgorithmRequestSigningCertificatesIssuanceTransformRulesIssuanceAuthorizationRulesDelegationAuthorizationRulesEncryptClaimsEncryptedNameIdRequiredEncryptionCertificateEncryptionCertificateRevocationCheckNotBeforeSkew注释ProtocolProfileSamlResponseSignatureSignedSamlRequestsRequiredSigningCertificateRevocationCheckTokenLifetime
XML 文件中的证书是 base64 编码的 DER 格式。使用 Convert.ToBase64String(X509Certificate2.RawData) 将证书对象转换为 string。使用 new X509Certificate2(Convert.FromBase64String(base64DERString)) 从 base64 编码的 DER string 创建证书对象。您可以使用证书管理工具从服务器上安装的证书创建 base64 DER。下面是一个 XML 文件的示例。
<?xml version="1.0" encoding="utf-8"?>
<RelyingPartyTrust>
<Name>WIF sample application (with SAML 2.0 extension CTP)</Name>
<Identifiers>
<Identifier>https://idp.company.com/ServiceProvider</Identifier>
</Identifiers>
<SamlEndpoints>
<SamlEndpoint>
<Binding>POST</Binding>
<Protocol>SAMLAssertionConsumer</Protocol>
<Index>0</Index>
<IsDefault>true</IsDefault>
<Location>https://idp.company.com/ServiceProvider/</Location>
<ResponseLocation />
</SamlEndpoint>
<SamlEndpoint>
<Binding>Artifact</Binding>
<Protocol>SAMLAssertionConsumer</Protocol>
<Index>1</Index>
<IsDefault>false</IsDefault>
<Location>https://idp.company.com/ServiceProvider/</Location>
<ResponseLocation />
</SamlEndpoint>
<SamlEndpoint>
<Binding>Redirect</Binding>
<Protocol>SAMLLogout</Protocol>
<Index>0</Index>
<IsDefault>false</IsDefault>
<Location>https://idp.company.com/ServiceProvider/</Location>
<ResponseLocation />
</SamlEndpoint>
</SamlEndpoints>
<WsFedEndpoint />
<AutoUpdateEnabled>false</AutoUpdateEnabled>
<MonitoringEnabled>false</MonitoringEnabled>
<MetadataUrl />
<SignatureAlgorithm>http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
</SignatureAlgorithm>
<RequestSigningCertificates />
<IssuanceTransformRules>@RuleTemplate = "LdapClaims"
@RuleName = "Retrieve AD attributes and send them as outgoing claims"
c:[Type == "http://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/name",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"),
query = ";displayName,mail,userPrincipalName,employeeType;{0}", param = c.Value);
@RuleTemplate = "LdapClaims"
@RuleName = "Sent userAccountControl"
c:[Type == http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname,
Issuer == "AD AUTHORITY"]
=> issue(store = "Active Directory",
types = (http://idp.company.com/useraccountcontrol),
query = ";userAccountControl;{0}", param = c.Value);
@RuleTemplate = "MapClaims"
@RuleName = "Calculate status from userAccountControl"
c:[Type == "http://idp.company.com/useraccountcontrol", Value =~ "^(?i)512$"]
=> issue(Type = http://idp.company.com/useraccountstatus,
Issuer = c.Issuer, OriginalIssuer = c.OriginalIssuer, Value = "active",
ValueType = c.ValueType);
</IssuanceTransformRules>
<IssuanceAuthorizationRules>@RuleTemplate = "AllowAllAuthzRule"
=> issue(Type = http://schemas.microsoft.com/authorization/claims/permit,
Value = "true");
</IssuanceAuthorizationRules>
<DelegationAuthorizationRules></DelegationAuthorizationRules>
<EncryptClaims>true</EncryptClaims>
<EncryptedNameIdRequired>false</EncryptedNameIdRequired>
<EncryptionCertificate>MIeC6DtaAdCgA...HgTe7Q==</EncryptionCertificate>
<EncryptionCertificateRevocationCheck>CheckChainExcludeRoot
</EncryptionCertificateRevocationCheck>
<NotBeforeSkew>0</NotBeforeSkew>
<Notes>The SAML 2.0 extension test.</Notes>
<ProtocolProfile>WsFed-SAML</ProtocolProfile>
<SamlResponseSignature>AssertionOnly</SamlResponseSignature>
<SignedSamlRequestsRequired>false</SignedSamlRequestsRequired>
<SigningCertificateRevocationCheck>CheckChainExcludeRoot
</SigningCertificateRevocationCheck>
<TokenLifetime>0</TokenLifetime>
</RelyingPartyTrust>
AddRelyingParty
AddRelyingParty 以 XML 文件作为参数,并在执行它的(主)AD FS 2.0 联合服务器上创建 Relying Party。例如:
AddRelyingParty "salesforce test.xml"
使用文件“_salesforce test.xml_”中指定的参数创建新的 Relying Party。
UpdateRelyingParty
UpdateRelyingParty 以 Relying Party 名称和 XML 文件作为参数,并在执行它的(主)AD FS 2.0 联合服务器上使用指定名称更新 Relying Party。无法使用 UpdateRelyingParty 更改 Relying Party 的名称。但是可以更改标识符和其他所有 Relying Party 参数。例如:
UpdateRelyingParty "salesforce test" "salesforce test.xml"
使用文件“_salesforce test.xml_”中的参数更新名称为“salesforce test”的 Relying Party。名称本身无法更改。
2. 在事件日志中搜索活动 ID
当 AD FS 2.0 在令牌颁发期间发生错误时,活动 ID 会在基于浏览器的场景中的通用错误页面中显示(作为参考号或附加数据)。
活动 ID 是 GUID 类型。错误消息将记录在处理令牌颁发的联合服务器的事件日志中。
AD FS 工具提供了控制台应用程序 GetEventLog。该控制台应用程序必须在有权读取联合服务器上事件日志的账户下执行。例如:
GetEventLog "0724A8D0-D873-4CB3-8762-C9A70084DD98"
"server1.company.com,server2.company.com"
...在 server1.company.com 和 server2.company.com 服务器上,在 AD FS 2.0 管理员事件日志中搜索相关活动 ID 设置为 0724A8D0-D873-4CB3-8762-C9A70084DD98 的事件日志条目。它会将事件 ID 和时间戳以及事件消息输出到控制台。命令行输出的一个示例如下图所示。
Using the Code
该代码利用 AD FS PowerShell API 和 LINQ to XML 进行 XML 处理,并使用 System.Diagnostics 命名空间和 XPath 查询进行 AD FS 2.0 事件日志分析。
历史
- 2011 年 9 月 28 日 - 发布原始版本
- 2011 年 9 月 29 日 - 包含所有可用的 Relying Party 属性
- 2011 年 10 月 4 日 - 包含事件日志分析工具
