在 Azure Active Directory B2C 中使用自定义策略将 AD FS 添加为 SAML 标识提供者

在开始之前,请使用此页面顶部的 “选择策略类型 选择器”来选择要设置的策略类型。 Azure Active Directory B2C 提供了两种定义用户如何与应用程序交互的方法:通过预定义的用户流,或者通过可完全配置的自定义策略。 对于每种方法,本文中所需的步骤都不同。

此功能仅适用于自定义策略。 对于设置步骤,请在前面的选择器中选择“自定义策略”。

注释

在 Azure Active Directory B2C 中,自定义策略 主要用于解决复杂场景。 对于大多数场景,我们建议您使用内置的用户流。 如果未这样做,请通过 Active Directory B2C 中的自定义策略入门来了解自定义策略初学者包。

本文介绍如何在 Azure Active Directory B2C(Azure AD B2C)中使用自定义策略为 AD FS 用户帐户启用登录。 通过将 SAML 标识提供者 添加到自定义策略来启用登录。

Prerequisites

创建自签名证书

如果你还没有证书,则可以使用自签名证书。 自签名证书是未由证书颁发机构(CA)签名的安全证书,不提供 CA 签名的证书的安全保证。

在Windows,使用 PowerShell 中的 New-SelfSignedCertificate cmdlet 生成证书。

  1. 运行以下 PowerShell 命令以生成自签名证书。 根据你的应用程序和 Azure AD B2C 租户名称(例如 contosowebapp.contoso.partner.onmschina.cn)相应地修改 -Subject 参数。 还可以调整 -NotAfter 日期以指定证书的不同到期时间。

    New-SelfSignedCertificate `
        -KeyExportPolicy Exportable `
        -Subject "CN=yourappname.yourtenant.partner.onmschina.cn" `
        -KeyAlgorithm RSA `
        -KeyLength 2048 `
        -KeyUsage DigitalSignature `
        -NotAfter (Get-Date).AddMonths(12) `
        -CertStoreLocation "Cert:\CurrentUser\My"
    
  2. 在Windows计算机上,搜索并选择“管理用户证书

  3. “证书 - 当前用户”下,选择个人>证书>yourappname.yourtenant.partner.onmschina.cn

  4. 选择证书,然后选择“ 操作>所有任务>导出”。

  5. 选择“下一步>是”,导出“>”私钥

  6. 接受 导出文件格式的默认值,然后选择“ 下一步”。

  7. 启用 密码 选项,输入证书的密码,然后选择“ 下一步”。

  8. 若要指定用于保存证书的位置,请选择“ 浏览 ”并导航到所选目录。

  9. “另存为 ”窗口中,输入 文件名,然后选择“ 保存”。

  10. 选择下一步>完成

若要Azure AD B2C 接受 .pfx 文件密码,必须使用Windows证书存储导出实用工具中的 TripleDES-SHA1 选项(而不是 AES256-SHA256)加密密码。

创建策略密钥

需要在 Azure AD B2C 租户中存储证书。

  1. 登录到 Azure 门户
  2. 如果你有权访问多个租户,请选择顶部菜单中的 设置 图标,然后从 目录 + 订阅 菜单切换到你的 Azure AD B2C 租户。
  3. 选择 Azure 门户左上角的“所有服务”,然后搜索并选择“Azure AD B2C” 。
  4. 在“概述”页上选择“标识体验框架”。
  5. 选择“策略密钥”,然后选择“添加”。
  6. 对于选项,请选择Upload
  7. 输入策略密钥的名称。 例如,SAMLSigningCert。 前缀 B2C_1A_ 会自动添加到您的密钥名称前。
  8. 浏览到证书 .pfx 文件并使用私钥选择证书。
  9. 单击 “创建”

添加声明提供程序

如果希望用户使用 AD FS 帐户登录,则需要将该帐户定义为 Azure AD B2C 可通过某个终结点与之通信的声明提供程序。 该终结点将提供一组声明,Azure AD B2C 使用这些声明来验证特定的用户是否已完成身份验证。

通过将 AD FS 帐户添加到策略扩展文件中的 ClaimsProviders 元素,可以将 AD FS 帐户定义为声明提供程序。 有关详细信息,请参阅 定义 SAML 标识提供者

  1. 打开 TrustFrameworkExtensions.xml

  2. 找到 ClaimsProviders 元素。 如果该元素不存在,请在根元素下添加它。

  3. 添加一个新的 ClaimsProvider,如下所示:

    <ClaimsProvider>
      <Domain>contoso.com</Domain>
      <DisplayName>Contoso</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="Contoso-SAML2">
          <DisplayName>Contoso</DisplayName>
          <Description>Login with your AD FS account</Description>
          <Protocol Name="SAML2"/>
          <Metadata>
            <Item Key="WantsEncryptedAssertions">false</Item>
            <Item Key="PartnerEntity">https://your-AD-FS-domain/federationmetadata/2007-06/federationmetadata.xml</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="SamlMessageSigning" StorageReferenceId="B2C_1A_SAMLSigningCert"/>
          </CryptographicKeys>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="userPrincipalName" />
            <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name"/>
            <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="family_name"/>
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email"/>
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name"/>
            <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="contoso.com" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication"/>
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-idp"/>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  4. your-AD-FS-domain 替换为您的 AD FS 域名,并将 identityProvider 输出声明的值替换为您的 DNS(用于指示您的域的任意值)。

  5. 找到该 <ClaimsProviders> 部分并添加以下 XML 代码片段。 如果策略已包含 SM-Saml-idp 技术配置文件,请跳到下一步。 有关详细信息,请参阅 单一登录会话管理

    <ClaimsProvider>
      <DisplayName>Session Management</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="SM-Saml-idp">
          <DisplayName>Session Management Provider</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.SamlSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="IncludeSessionIndex">false</Item>
            <Item Key="RegisterServiceProviders">false</Item>
          </Metadata>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  6. 保存文件。

添加用户历程

此时,身份提供商已设置完毕,但尚未在任何登录页面中可用。 如果你没有自己的自定义用户旅程,请创建现有模板用户旅程的副本,否则,请继续执行下一步。

  1. 打开初学者包中的 TrustFrameworkBase.xml 文件。
  2. 找到包含 Id="SignUpOrSignIn" 元素,并复制其全部内容。
  3. 打开 TrustFrameworkExtensions.xml 并找到 UserJourneys 元素。 如果该元素不存在,请添加一个。
  4. 将你复制的 UserJourney 元素的完整内容作为 UserJourneys 元素的子元素粘贴。
  5. 对用户旅程的 ID 进行重命名。 例如,Id="CustomSignUpSignIn"

将标识提供者添加到用户旅程

现在你已经有了用户旅程,请将新的身份提供者添加到该用户旅程中。 首先添加一个“登录”按钮,然后将该按钮链接到某个操作。 该操作对应于你之前创建的技术配置文件。

  1. 在用户旅程中,查找包含 Type="CombinedSignInAndSignUp"Type="ClaimsProviderSelection" 的业务流程步骤元素。 这通常是第一个编排步骤。 ClaimsProviderSelections 元素包含用户可以用来登录的标识提供者列表。 元素的顺序将决定向用户显示的登录按钮的顺序。 添加ClaimsProviderSelection XML 元素。 将 TargetClaimsExchangeId 的值设置为易记名称。

  2. 在下一个编排步骤中,添加 ClaimsExchange 元素。 将 Id 设置为目标声明交换的 Id 值。将 TechnicalProfileReferenceId 的值更新为之前创建的技术配置文件的 Id。

下面的 XML 演示了使用标识提供者进行用户旅程的前两个业务流程步骤:

<OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin">
  <ClaimsProviderSelections>
    ...
    <ClaimsProviderSelection TargetClaimsExchangeId="ContosoExchange" />
  </ClaimsProviderSelections>
  ...
</OrchestrationStep>

<OrchestrationStep Order="2" Type="ClaimsExchange">
  ...
  <ClaimsExchanges>
    <ClaimsExchange Id="ContosoExchange" TechnicalProfileReferenceId="Contoso-SAML2" />
  </ClaimsExchanges>
</OrchestrationStep>

配置信赖方策略

信赖方策略(例如SignUpSignIn.xml)指定了 Azure AD B2C 将执行的用户旅程。 在依赖方中查找DefaultUserJourney元素。 更新 ReferenceId,使其与您在其中添加了标识提供者的用户旅程 ID 相匹配。

在以下示例中,对于 CustomSignUpSignIn 用户旅程,将 ReferenceId 设置为 CustomSignUpSignIn

<RelyingParty>
  <DefaultUserJourney ReferenceId="CustomSignUpSignIn" />
  ...
</RelyingParty>

上传自定义策略

  1. 登录到 Azure 门户
  2. 选择门户工具栏中的 Directory + Subscription 图标,然后选择包含Azure AD B2C 租户的目录。
  3. 在 Azure 门户中,搜索并选择 Azure AD B2C
  4. 在“策略”下,选择“Identity Experience Framework”。
  5. 选择“上传自定义策略”,然后上传已更改的两个策略文件,其顺序为:先上传扩展策略(例如 ),然后上传信赖方策略(例如 TrustFrameworkExtensions.xml)。

配置 AD FS 信赖方信任关系

若要在 Azure AD B2C 中使用 AD FS 作为标识提供者,需要使用 Azure AD B2C SAML 元数据创建 AD FS 信赖方信任。 以下示例演示Azure AD B2C 技术配置文件的 SAML 元数据的 URL 地址:

https://your-tenant-name.b2clogin.cn/your-tenant-name.partner.onmschina.cn/your-policy/samlp/metadata?idptp=your-technical-profile

使用 自定义域时,请使用以下格式:

https://your-domain-name/your-tenant-name.partner.onmschina.cn/your-policy/samlp/metadata?idptp=your-technical-profile

请替换以下值:

  • your-tenant-name 替换为你的租户名称,例如 your-tenant.partner.onmschina.cn。
  • your-domain-name 替换为你的自定义域名,例如 login.contoso.com。
  • your-policy 替换为您的策略名称。 例如,B2C_1A_signup_signin_adfs。
  • your-technical-profile 替换为你的 SAML 标识提供程序技术配置文件的名称。 例如,Contoso-SAML2。

打开浏览器并导航到 URL。 请确保键入正确的 URL,并且你有权访问 XML 元数据文件。 若要使用 AD FS 管理管理单元添加新信赖方信任并手动配置设置,请在联合服务器上执行以下过程。 本地计算机上的 管理员 成员身份或等效成员身份是完成此过程所需的最低要求。

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

  2. 选择 添加信赖方信任关系

  3. 欢迎页面上,选择Claims aware,然后选择开始

  4. 在“选择数据源”页上,选择“导入有关在线发布或在本地网络上发布的依赖方的数据”,提供 Azure AD B2C 元数据 URL,然后选择“下一步”。

  5. 在“指定显示名称”页上,在“备注”下输入此信赖方信任的说明,然后选择“下一步”。

  6. 在“选择访问控制策略”页面上,选择一个策略,然后选择“下一步”。

  7. “准备添加信任 ”页上,查看设置,然后选择“ 下一步 ”保存信赖方信任信息。

  8. 在“ 完成 ”页上,选择“ 关闭”,此操作会自动显示 “编辑声明规则 ”对话框。

  9. 选择“ 添加规则”。

  10. 声明规则模板中,选择“ 发送 LDAP 属性”作为声明

  11. 提供“声明规则名称”。 对于属性存储区,请选择“选择Active Directory,添加以下声明,然后选择”完成“和”确定”。

    LDAP 属性 传出声明类型
    用户主体名称 userPrincipalName
    Surname 姓氏
    Given-Name given_name
    电子邮件地址 电子邮件
    Display-Name 名字

    请注意,某些名称不会显示在传出声明类型下拉列表中。 需要手动键入它们。 (下拉列表是可编辑的)。

  12. 根据证书类型,可能需要设置 HASH 算法。 在“依赖方信任(B2C Demo)”属性窗口中,选择高级选项卡,将安全哈希算法更改为SHA-256,然后选择确定

  13. 在服务器管理器中,选择“工具”,然后选择“AD FS 管理”。

  14. 选择你创建的信赖方信任,选择从联合元数据更新,然后选择更新

测试自定义策略

  1. 登录到 Azure 门户
  2. 如果你有权访问多个租户,请选择顶部菜单中的 设置 图标,然后从 目录 + 订阅 菜单切换到你的 Azure AD B2C 租户。
  3. 在 Azure 门户中,搜索并选择 Azure AD B2C
  4. “策略”下,选择“标识体验框架
  5. 选择你的依赖方策略,例如 B2C_1A_signup_signin
  6. 对于应用程序,请选择您前面注册的 Web 应用程序。 Reply URL 应显示 https://jwt.ms
  7. 选择“立即运行”按钮。
  8. 在注册或登录页中,选择 Contoso AD FS 以使用 Contoso AD FS 标识提供者登录。

如果登录过程成功,浏览器将重定向到 https://jwt.ms,其中显示 Azure AD B2C 返回的令牌的内容。

AD FS 服务疑难解答

AD FS 配置为使用Windows应用程序日志。 如果在 Azure AD B2C 中使用自定义策略将 AD FS 设置为 SAML 标识提供者时遇到问题,可能需要检查 AD FS 事件日志:

  1. 在Windows搜索栏上,键入事件查看器,然后选择事件查看器桌面应用。
  2. 若要查看其他计算机的日志,请右键单击事件查看器(本地)。 选择 “连接到另一台计算机”,并填写字段以完成 “选择计算机 ”对话框。
  3. 事件查看器中,打开应用程序和服务日志
  4. 选择 AD FS,然后选择 “管理员”。
  5. 若要查看有关事件的详细信息,请双击该事件。

SAML 请求未使用预期的签名算法事件进行签名

此错误表示Azure AD B2C 发送的 SAML 请求未使用 AD FS 中配置的预期签名算法进行签名。 例如,SAML 请求使用签名算法 rsa-sha256进行签名,但预期的签名算法是 rsa-sha1。 若要解决此问题,请确保Azure AD B2C 和 AD FS 都配置了相同的签名算法。

选项 1:在 Azure AD B2C 中设置签名算法

可以配置如何在 AZURE AD B2C 中对 SAML 请求进行签名。 XmlSignatureAlgorithm 元数据控制 SAML 请求中 SigAlg 参数(查询字符串参数或 POST 参数)的值。 以下示例将 Azure AD B2C 配置为使用rsa-sha256签名算法。

<Metadata>
  <Item Key="WantsEncryptedAssertions">false</Item>
  <Item Key="PartnerEntity">https://your-AD-FS-domain/federationmetadata/2007-06/federationmetadata.xml</Item>
  <Item Key="XmlSignatureAlgorithm">Sha256</Item>
</Metadata>

选项 2:在 AD FS 中设置签名算法

或者,可以在 AD FS 中配置预期的 SAML 请求签名算法。

  1. 在服务器管理器中,选择“工具”,然后选择“AD FS 管理”。
  2. 选择之前创建的 信赖方信任关系
  3. 选择“属性”,然后选择“高级
  4. 配置 安全哈希算法,然后选择“ 确定 ”保存更改。

HTTP-Redirect 请求不包含签名请求所需的参数“Signature”(AADB2C90168)

选项 1:在 Azure AD B2C 中将 ResponsesSigned 设置为 false

可以在 Azure AD B2C 中禁用已签名消息的要求。 以下示例将 Azure AD B2C 配置为无需已签名请求中的“Signature”参数。

<Metadata>
  <Item Key="WantsEncryptedAssertions">false</Item>
  <Item Key="PartnerEntity">https://your-AD-FS-domain/federationmetadata/2007-06/federationmetadata.xml</Item>
  <Item Key="ResponsesSigned">false</Item>
</Metadata>

选项 2:在 AD FS 中设置信赖方以对消息和断言进行签名

或者,可以在 AD FS 中配置信赖方,如下所示:

  1. 以管理员身份打开 PowerShell 并运行 Set-AdfsRelyingPartyTrust -TargetName <RP Name> -SamlResponseSignature MessageAndAssertion cmdlet 以对消息和断言进行签名。
  2. 运行 Set-AdfsRelyingPartyTrust -TargetName <RP Name> 并确认 SamlResponseSignature 属性设置为 MessageAndAssertion