开始之前,请使用此页顶部的“选择策略类型”选择器来选择要设置的策略类型。 Azure Active Directory B2C 提供了两种定义用户如何与应用程序交互的方法:通过预定义的用户流,或者通过可完全配置的自定义策略。 对于每种方法,本文中所需的步骤都不同。
此功能仅适用于自定义策略。 对于设置步骤,请在前面的选择器中选择“自定义策略”。
备注
在 Azure Active Directory B2C 中,自定义策略主要用于解决复杂的情况。 在大多数情况下,建议你使用内置用户流。 如果尚未这样做,请从 Active Directory B2C 中的自定义策略入门了解自定义策略新手包。
本文介绍如何让 AD FS 用户帐户使用 Azure Active Directory B2C (Azure AD B2C) 中的自定义策略登录。 可通过将 SAML 标识提供者添加到自定义策略来实现登录。
- 完成 Active Directory B2C 中的自定义策略入门中的步骤。 本教程指导你如何更新自定义策略文件以使用 Azure AD B2C 租户配置。
- 如果尚未注册 Web 应用,请按照注册 Web 应用程序中的步骤注册一个。
如果你还没有证书,则可以使用自签名证书。 自签名证书是未由证书颁发机构 (CA) 签署的安全证书,不提供由 CA 签名的证书的安全保障。
在 Windows 上,可在 PowerShell 中使用 New-SelfSignedCertificate cmdlet 来生成证书。
运行以下 PowerShell 命令来生成自签名证书。 根据应用程序和 Azure AD B2C 租户名称修改
-Subject
参数,如contosowebapp.contoso.partner.onmschina.cn
。 还可调整-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"
在 Windows 计算机上,搜索并选择“管理用户证书”
在“证书 - 当前用户”下,选择“个人”“证书”“yourappname.yourtenant.partner.onmschina.cn”。
选择该证书,然后依次选择“操作”>“所有任务”>“导出”。
选择“下一步”>“是,导出私钥”>“下一步” 。
接受“导出文件格式”的默认值,然后选择“下一步” 。
启用“密码”选项,输入证书的密码,然后选择“下一步” 。
若要指定保存证书的位置,请选择“浏览”并导航到所选的目录。
在“另存为”窗口中,输入文件名,然后选择“保存” 。
选择“下一步”>“完成”。
要让 Azure AD B2C 接受 .pfx 文件密码,必须在 Windows 证书存储导出实用工具中使用 TripleDES-SHA1 选项,而不是 AES256-SHA256 对此密码进行加密。
需要将你的证书存储在 Azure AD B2C 租户中。
- 登录 Azure 门户。
- 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,切换到“目录 + 订阅”菜单中的 Azure AD B2C 租户。
- 选择 Azure 门户左上角的“所有服务”,然后搜索并选择“Azure AD B2C” 。
- 在“概述”页上选择“标识体验框架”。
- 选择“策略密钥”,然后选择“添加”。
- 对于“选项”,请选择
Upload
。 - 输入策略密钥的名称。 例如,
SAMLSigningCert
。 前缀B2C_1A_
会自动添加到密钥名称。 - 浏览并选择带有私钥的证书 .pfx 文件。
- 单击“创建”。
如果希望用户使用 AD FS 帐户登录,需将该帐户定义为 Azure AD B2C 可通过终结点与其进行通信的声明提供程序。 该终结点将提供一组声明,Azure AD B2C 使用这些声明来验证特定的用户是否已完成身份验证。
可以通过在策略的扩展文件中将 AD FS 帐户添加到 ClaimsProviders 元素,将该帐户定义为声明提供程序。 有关详细信息,请参阅定义 SAML 标识提供者。
打开 TrustFrameworkExtensions.xml。
找到 ClaimsProviders 元素。 如果该元素不存在,请在根元素下添加它。
如下所示添加新的 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>
将
your-AD-FS-domain
替换为你的 AD FS 域的名称,将 identityProvider 输出声明的值替换为你的 DNS(表示你的域的任意值)。找到
<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>
保存文件。
此时,标识提供者已设置,但还不能在任何登录页中使用。 如果你没有自己的自定义用户旅程,请创建现有模板用户旅程的副本,否则,请继续执行下一步。
- 打开初学者包中的 TrustFrameworkBase.xml 文件。
- 找到并复制包含
Id="SignUpOrSignIn"
的 UserJourney 元素的完整内容。 - 打开 TrustFrameworkExtensions.xml 并找到 UserJourneys 元素。 如果该元素不存在,请添加一个。
- 将复制的 UserJourney 元素的完整内容粘贴为 UserJourneys 元素的子级。
- 对用户旅程的 ID 进行重命名。 例如,
Id="CustomSignUpSignIn"
。
目前你已拥有用户旅程,请将新的标识提供者添加到用户旅程。 首先添加一个“登录”按钮,然后将该按钮链接到某个操作。 该操作是你之前创建的技术配置文件。
在用户旅程中,查找包含
Type="CombinedSignInAndSignUp"
或Type="ClaimsProviderSelection"
的业务流程步骤元素。 这通常是第一个业务流程步骤。 ClaimsProviderSelections 元素包含用户可以用来登录的标识提供者列表。 元素的顺序将决定向用户显示的登录按钮的顺序。 添加 ClaimsProviderSelection XML 元素。 将 TargetClaimsExchangeId 的值设置为易记名称。在下一个业务流程步骤中,添加 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>
- 登录到 Azure 门户。
- 在门户工具栏中选择“目录 + 订阅”图标,然后选择包含 Azure AD B2C 租户的目录。
- 在 Azure 门户中,搜索并选择“Azure AD B2C”。
- 在“策略”下,选择“Identity Experience Framework”。
- 选择“上传自定义策略”,然后上传已更改的两个策略文件,其顺序为:先上传扩展策略(例如
TrustFrameworkExtensions.xml
),然后上传信赖方策略(例如SignUpSignIn.xml
)。
要将 AD FS 用作 Azure AD B2C 中的标识提供者,需要使用 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
请替换以下值:
- 将 your-tenant-name 替换为你的租户名称,例如 your-tenant.partner.onmschina.cn。
- 将 your-policy 替换为你的策略名称。 例如,B2C_1A_signup_signin_adfs。
- 将 your-technical-profile 替换为 SAML 标识提供者技术配置文件的名称。 例如,Contoso-SAML2。
打开浏览器并导航到此 URL。 确保键入正确的 URL 并且你有权访问 XML 元数据文件。 要通过使用 AD FS 管理管理单元添加新的依赖方信任并手动配置设置,请在联合服务器上执行以下过程。 本地计算机上“管理员”中的成员身份或同等身份是完成此过程所需的最低要求。
在“服务器管理器”中,选择“工具”,然后选择“AD FS 管理”。
选择“添加信赖方信任”。
在“欢迎”页上,选择“声明感知”,然后选择“启动”。
在“选择数据源”页上,选择“导入有关联机发布的或在本地网络上发布的信赖方的数据”,提供 Azure AD B2C 元数据 URL,然后选择“下一步”。
在“指定显示名称”页上,输入一个“显示名称”,在“说明”下输入有关此信赖方信任的说明,然后选择“下一步”。
在“选择访问控制策略”页上选择一个策略,然后选择“下一步”。
在“准备添加信任”页上,查看设置,然后选择“下一步”来保存信赖方信任信息。
在“完成”页上选择“关闭”,此操作会自动显示“编辑声明规则”对话框。
选择“添加规则”。
在“声明规则模板”中,选择“以声明方式发送 LDAP 特性”。
提供“声明规则名称”。 对于“属性存储”,请选择“选择 Active Directory”,添加以下声明,然后选择“完成”和“确定”。
LDAP 属性 传出声明类型 User-Principal-Name userPrincipalName Surname family_name Given-Name given_name E-Mail-Address 电子邮件 Display-Name name 请注意,某些名称不会显示在传出声明类型下拉列表中。 需要手动键入它们。 (下拉列表是可编辑的)。
根据证书类型,可能需要设置哈希算法。 在信赖方信任(B2C 演示)属性窗口中,选择“高级”选项卡并将“安全哈希算法”更改为
SHA-256
,然后选择“确定” 。在“服务器管理器”中,选择“工具”,然后选择“AD FS 管理”。
依次选择所创建的信赖方信任、“从联合元数据更新”、“更新”。
- 登录 Azure 门户。
- 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,从“目录 + 订阅”菜单中切换到你的 Azure AD B2C 租户。
- 在 Azure 门户中,搜索并选择“Azure AD B2C” 。
- 在“策略”下,选择“Identity Experience Framework”
- 选择信赖方策略,例如
B2C_1A_signup_signin
。 - 对于“应用程序”,请选择前面注册的 Web 应用程序。 “回复 URL”应显示为
https://jwt.ms
。 - 选择“立即运行”按钮。
- 在注册或登录页面上,选择“Contoso AD FS”以使用 Contoso AD FS 标识提供者登录。
如果登录过程是成功的,则你的浏览器会被重定向到 https://jwt.ms
,其中显示 Azure AD B2C 返回的令牌内容。
AD FS 被配置为使用 Windows 应用程序日志。 如果在 Azure AD B2C 中使用自定义策略将设置 AD FS 作为 SAML 标识提供者时遇到挑战,你可能想要检查 AD FS 事件日志:
- 在 Windows“搜索栏”中,键入“事件查看器”,然后选择“事件查看器”桌面应用。
- 若要查看另一台计算机的日志,右键单击“事件查看器(本地)”。 选择“连接到另一台计算机”,并填写字段以完成“选择计算机”对话框。
- 在“事件查看器”中,打开“应用程序和服务日志” 。
- 依次选择“AD FS”和“管理员”。
- 若要查看有关某事件的详细信息,请双击该事件。
此错误表明,Azure AD B2C 发送的 SAML 请求未通过 AD FS 中配置的预期签名算法进行签名。 例如,SAML 请求是通过签名算法 rsa-sha256
进行签名的,但预期签名算法却是 rsa-sha1
。 若要解决此问题,请确保 Azure AD B2C 和 AD FS 均配置有相同的签名算法。
可以配置如何在 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>
或者,你还可以在 AD FS 中配置预期的 SAML 请求签名算法。
- 在“服务器管理器”中,选择“工具”,然后选择“AD FS 管理”。
- 选择之前创建的“信赖方信任”。
- 依次选择“属性”和“高级”
- 配置“安全哈希算法”,然后选择“确定”以保存更改。
可以在 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>
或者,可以在 AD FS 中配置信赖方,如下所述:
- 以管理员身份打开 PowerShell 并运行
Set-AdfsRelyingPartyTrust -TargetName <RP Name> -SamlResponseSignature MessageAndAssertion
cmdlet,以对消息和断言进行签名。 - 运行
Set-AdfsRelyingPartyTrust -TargetName <RP Name>
并确认 SamlResponseSignature 属性设置为 MessageAndAssertion。