使用 AD FS 设置 SAML 2.0 提供者

Active Directory 联合身份验证服务 (AD FS) 是一个 SAML 2.0 标识提供者,您可以使用它来对 Power Pages 站点的访问者进行身份验证。 您可以使用符合 SAML 2.0 规范的任何提供者。

本文介绍以下步骤:

重要提示

设置 AD FS 的步骤可能会有所不同,具体取决于您的 AD FS 服务器的版本。

在 Power Pages 中设置 AD FS

将 AD FS 设置为您的站点的标识提供者。

  1. 在您的 Power Pages 站点中,选择设置>标识提供者

    如果没有显示标识提供者,确保在站点的常规身份验证设置中将外部登录设置为

  2. 选择 + 新增提供者

  3. 选择登录提供者下,选择其他

  4. 协议下,选择 SAML 2.0

  5. 为提供商输入名称。

    提供者名称是用户在登录页面上选择标识提供者时看到的按钮上的文本。

  6. 选择下一步

  7. 回复 URL 下,选择复制

    不要关闭您的 Power Pages 浏览器标签页。您很快就会返回。

创建 AD FS 信赖方信任

您还可以使用 PowerShell 脚本执行这些步骤

  1. 在服务器管理器中,选择工具,然后选择 AD FS 管理

  2. 展开服务

  3. 在右侧面板中,选择添加声明说明

  4. 输入以下值:

    • 显示名称永久标识符

    • 声明标识符urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

    • 选择均在联合元数据中发布此声明说明… 选项。

  5. 选择确定

  6. 选择信任关系>信赖方信任

  7. 选择添加信赖方信任

  8. 选择开始

  9. 选择手动输入有关信赖方的数据,然后选择下一步

  10. 输入名称;例如,https://portal.contoso.com/

  11. 选择下一步

  12. 选择 AD FS 2.0 配置文件,然后选择下一步

  13. 配置证书页面上,选择下一步

  14. 选择启用 SAML 2.0 WebSSO 协议的支持

  15. 信赖方 SAML 2.0 SSO 服务 URL 下,输入您复制的回复 URL。 AD FS 要求网站运行 HTTPS,而不是 HTTP。

  16. 选择下一步

  17. 配置标识符页面上,输入您的站点的 URL,然后选择添加

    如果需要,您可以为每个其他信赖方网站添加更多身份。 用户可以使用任何可用的身份进行身份验证。

  18. 选择下一步

  19. 立即配置多重身份验证?页面上,选择我不想现在为此信赖方信任配置多重身份验证设置

  20. 选择颁发授权规则页上,选择允许所有用户访问此信赖方,然后选择下一步

  21. 查看信任设置,然后选择下一步

  22. 选择关闭

  23. 编辑声明规则中,根据您正在编辑的信任以及要在哪个规则集中创建规则,选择以下选项卡之一:

    • 接受转换规则
    • 颁发转换规则
    • 颁发授权规则
    • 委派授权规则
  24. 选择添加规则

  25. 声明规则模板列表中,选择转换传入声明,然后选择下一步

  26. 输入或选择以下值:

    • 声明规则名称将 Windows 帐户名称转换为名称 ID

    • 传入声明类型Windows 帐户名称

    • 传出声明类型名称 ID

    • 传出名称 ID 格式永久标识符

  27. 选择传递所有声明值

  28. 选择完成,然后选择确定

完成提供者设置

设置 AD FS 信赖方信任后:

  1. 在 Azure 中创建应用注册

  2. 在 Power Pages 中输入站点设置

标识提供者发起的登录

AD FS 支持 SAML 2.0 规范标识提供者启动的单一登录 (SSO) 配置文件。 要使服务提供商网站正确响应标识提供者的 SAML 请求,您必须对 RelayState 参数进行编码。

要在 SAML RelayState 参数中编码的基本字符串值必须采用格式 ReturnUrl=/content/sub-content/,其中 /content/sub-content/ 是您想要在服务提供商网站上转到的页面的路径。 您可以指定网站上任何有效页面的路径。 字符串值编码并放到 RPID=&lt;URL encoded RPID&gt;&RelayState=&lt;URL encoded RelayState&gt; 格式的容器字符串中。 整个字符串将又一次编码并添加到 <https://adfs.contoso.com/adfs/ls/idpinitiatedsignon.aspx?RelayState=&lt;URL> encoded RPID/RelayState&gt; 格式的另一个容器中。

例如,指定服务提供商路径 /content/sub-content/ 和信赖方 ID https://portal.contoso.com/,按照以下步骤构建 URL:

  • 对值 ReturnUrl=/content/sub-content/ 进行编码以获取 ReturnUrl%3D%2Fcontent%2Fsub-content%2F

  • 对值 https://portal.contoso.com/ 进行编码以获取 https%3A%2F%2Fportal.contoso.com%2F

  • 对值 RPID=https%3A%2F%2Fportal.contoso.com%2F&RelayState=ReturnUrl%3D%2Fcontent%2Fsub-content%2F 进行编码以获取 RPID%3Dhttps%253A%252F%252Fportal.contoso.com%252F%26RelayState%3DReturnUrl%253D%252Fcontent%252Fsub-content%252F

  • 预置 AD FS 标识提供者发起的 SSO 路径以获取最终 URL https://adfs.contoso.com/adfs/ls/idpinitiatedsignon.aspx?RelayState=RPID%3Dhttps%253A%252F%252Fportal.contoso.com%252F%26RelayState%3DReturnUrl%253D%252Fcontent%252Fsub-content%252F

您可以使用以下 PowerShell 脚本来构建 URL。 将脚本保存到一个名为 Get-IdPInitiatedUrl.ps1 的文件中。


<#
.SYNOPSIS 
Constructs an IdP-initiated SSO URL to access a website page on the service provider.
.PARAMETER path
The path to the website page.
.PARAMETER rpid
The relying party identifier.
.PARAMETER adfsPath
The AD FS IdP initiated SSO page.
.EXAMPLE
PS C:\\> .\\Get-IdPInitiatedUrl.ps1 -path "/content/sub-content/" -rpid "https://portal.contoso.com/" -adfsPath "https://adfs.contoso.com/adfs/ls/idpinitiatedsignon.aspx"
#>
param
(
[parameter(mandatory=$true,position=0)]
$path,
[parameter(mandatory=$true,position=1)]
$rpid,
[parameter(position=2)]
$adfsPath = https://adfs.contoso.com/adfs/ls/idpinitiatedsignon.aspx
)
$state = ReturnUrl=$path
$encodedPath = [uri]::EscapeDataString($state)
$encodedRpid = [uri]::EscapeDataString($rpid)
$encodedPathRpid = [uri]::EscapeDataString("RPID=$encodedRpid&RelayState=$encodedPath")
$idpInitiatedUrl = {0}?RelayState={1} -f $adfsPath, $encodedPathRpid
Write-Output $idpInitiatedUrl

使用 PowerShell 配置 AD FS

您可以在 AD FS 服务器上运行以下 PowerShell 脚本,而不是在 AD FS 中手动添加信赖方信任。 将脚本保存到一个名为 Add-AdxPortalRelyingPartyTrustForSaml.ps1 的文件中。 脚本执行后,继续在 Power Pages 中配置站点设置

<# 
.SYNOPSIS
Adds a SAML 2.0 relying party trust entry for a website.
.PARAMETER domain
The domain name of the website.
.EXAMPLE
PS C:\\> .\\Add-AdxPortalRelyingPartyTrustForSaml.ps1 -domain portal.contoso.com
#>
param
(
[parameter(Mandatory=$true,Position=0)]
$domain,
[parameter(Position=1)]
$callbackPath = /signin-saml2
)
$VerbosePreference = Continue
$ErrorActionPreference = Stop
Import-Module adfs
Function Add-CrmRelyingPartyTrust
{
param (
[parameter(Mandatory=$true,Position=0)]
$name
)
$identifier = https://{0}/ -f $name
$samlEndpoint = New-ADFSSamlEndpoint -Binding POST -Protocol SAMLAssertionConsumer -Uri (https://{0}{1} -f $name, $callbackPath)
$identityProviderValue = Get-ADFSProperties | % { $_.Identifier.AbsoluteUri }
$issuanceTransformRules = @'
@RuleTemplate = MapClaims
@RuleName = Transform [!INCLUDE[pn-ms-windows-short](../../../includes/pn-ms-windows-short.md)] Account Name to Name ID claim
c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
=> issue(Type = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Issuer = c.Issuer, OriginalIssuer = c.OriginalIssuer, Value = c.Value, ValueType = c.ValueType, Properties["https://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] = "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent");
@RuleTemplate = LdapClaims
@RuleName = Send LDAP Claims
c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> issue(store = "[!INCLUDE[pn-active-directory](../../../includes/pn-active-directory.md)]", types = ("https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname", "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname", "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"), query = ";givenName,sn,mail;{{0}}", param = c.Value);
'@ -f $identityProviderValue
$issuanceAuthorizationRules = @'
@RuleTemplate = AllowAllAuthzRule
=> issue(Type = https://schemas.microsoft.com/authorization/claims/permit, Value = true);
'@
Add-ADFSRelyingPartyTrust -Name $name -Identifier $identifier -SamlEndpoint $samlEndpoint -IssuanceTransformRules $issuanceTransformRules -IssuanceAuthorizationRules $issuanceAuthorizationRules
}
# add the 'Identity Provider' claim description if it is missing
[!INCLUDE[cc-pages-ga-banner](../../../includes/cc-pages-ga-banner.md)]
if (-not (Get-ADFSClaimDescription | ? { $_.Name -eq Persistent Identifier })) {
Add-ADFSClaimDescription -name "Persistent Identifier" -ClaimType "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" -IsOffered:$true -IsAccepted:$true
}
# add the website relying party trust
[!INCLUDE[cc-pages-ga-banner](../../../includes/cc-pages-ga-banner.md)]
Add-CrmRelyingPartyTrust $domain

另请参见

设置 SAML 2.0 提供者
使用 Microsoft Entra ID 设置 SAML 2.0 提供者
SAML 2.0 常见问题