使用 Azure Active Directory B2C 设置通过通用 OpenID Connect 注册与登录
开始之前,请使用此页顶部的“选择策略类型”选择器来选择要设置的策略类型。 Azure Active Directory B2C 提供了两种定义用户如何与应用程序交互的方法:通过预定义的用户流,或者通过可完全配置的自定义策略。 对于每种方法,本文中所需的步骤都不同。
OpenID Connect 是构建在 OAuth 2.0 基础之上的身份验证协议,可用于安全的用户登录。 Azure AD B2C 支持大多数使用此协议的标识提供者。
先决条件
- 创建用户流,以便用户能够注册并登录应用程序。
- 注册 Web 应用程序。
- 完成 Active Directory B2C 中的自定义策略入门中的步骤。 本教程指导你如何更新自定义策略文件以使用 Azure AD B2C 租户配置。
- 注册 Web 应用程序。
添加标识提供者
- 以 Azure AD B2C 租户的全局管理员身份登录 Azure 门户。
- 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,切换到“目录 + 订阅”菜单中的 Azure AD B2C 租户。
- 选择 Azure 门户左上角的“所有服务” ,搜索并选择 Azure AD B2C。
- 选择“标识提供程序”,然后选择“新建 OpenID Connect 提供程序” 。
- 输入“名称”。 例如,输入“Contoso”。
通过在策略的扩展文件中将 OpenID Connect 标识提供者添加到 ClaimsProviders 元素来定义该标识提供者。
打开 TrustFrameworkExtensions.xml。
找到 ClaimsProviders 元素。 如果该元素不存在,请在根元素下添加它。
如下所示添加新的 ClaimsProvider:
<ClaimsProvider> <Domain>contoso.com</Domain> <DisplayName>Login with Contoso</DisplayName> <TechnicalProfiles> <TechnicalProfile Id="Contoso-OpenIdConnect"> <DisplayName>Contoso</DisplayName> <Description>Login with your Contoso account</Description> <Protocol Name="OpenIdConnect"/> <Metadata> <Item Key="METADATA">https://your-identity-provider.com/.well-known/openid-configuration</Item> <Item Key="client_id">00001111-aaaa-2222-bbbb-3333cccc4444</Item> <Item Key="response_types">code</Item> <Item Key="scope">openid profile</Item> <Item Key="response_mode">form_post</Item> <Item Key="HttpBinding">POST</Item> <Item Key="UsePolicyInRedirectUri">false</Item> </Metadata> <!-- <CryptographicKeys> <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/> </CryptographicKeys> --> <OutputClaims> <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="oid"/> <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/> <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" /> <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" /> <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" /> <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" /> <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" /> <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" /> <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid"/> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/> <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/> <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/> <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/> </OutputClaimsTransformations> <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin"/> </TechnicalProfile> </TechnicalProfiles> </ClaimsProvider>
配置标识提供者
每个 OpenID Connect 标识提供者都描述一个元数据文档,该文档包含了登录所需的大部分信息。 元数据文档包括要使用的 URL 和服务的公共签名密钥的位置等信息。 OpenID Connect 元数据文档始终位于以 .well-known/openid-configuration
结尾的的终结点上。 输入想要添加的 OpenID Connect 标识提供者的元数据 URL。
在“元数据 URL”中,输入 OpenID Connect 元数据文档的 URL。
在 <Item Key="METADATA">
技术配置文件元数据中,输入 OpenID Connect 元数据文档的 URL。
客户端 ID 和密码
为了允许用户登录,标识提供者将要求开发人员在其服务中注册应用程序。 此应用程序具备 ID(也就是“客户端 ID”)和客户端密码。
客户端密码是可选项。 但是,如果响应类型为 code
,则必需提供客户端密码,因为这种响应类型使用密码来交换令牌的代码。
要添加客户端 ID 和客户端密码,请从标识提供者复制这些值,并将其输入到相应的字段中。
在 <Item Key="client_id">
技术配置文件元数据中,输入客户端 ID。
创建策略密钥
如果需要客户端密码,请存储以前在 Azure AD B2C 租户中记录的客户端密码。
登录 Azure 门户。
请确保使用的是包含 Azure AD B2C 租户的目录。 在门户工具栏中选择“目录 + 订阅”筛选器。
在“门户设置 | 目录+订阅”页上的“目录名称”列表中找到你的 Azure AD B2C 目录,然后选择“切换”。
选择 Azure 门户左上角的“所有服务”,然后搜索并选择“Azure AD B2C” 。
在“概述”页上选择“标识体验框架”。
选择“策略密钥”,然后选择“添加”。
对于“选项”,请选择
Manual
。输入策略密钥的名称。 例如,
ContosoSecret
。 前缀B2C_1A_
会自动添加到密钥名称。在“机密”中,输入前面记录的应用程序机密。
在“密钥用法”处选择
Signature
。单击“创建”。
在
CryptographicKeys
XML 元素中添加以下元素:<CryptographicKeys> <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/> </CryptographicKeys>
作用域
范围定义了你希望从标识提供者处收集的信息和权限,例如 openid profile
。 为便于从标识提供者处接收 ID 令牌,必须指定 openid
范围。
如果没有 ID 令牌,用户就无法使用自定义标识提供者登录到 Azure AD B2C。 可以追加其他范围(以空格分隔)。 请参阅自定义标识提供者的文档,查看其他可用范围。
在“作用域”中,输入标识提供者的作用域。 例如,openid profile
。
在 <Item Key="scope">
技术配置文件元数据中,输入标识提供者的作用域。 例如,openid profile
。
响应类型
响应类型描述在首次调用自定义标识提供者的 authorization_endpoint
时发回的信息类型。 可以使用以下响应类型:
code
:根据授权代码流,会将一个代码返回到 Azure AD B2C。 Azure AD B2C 将继续调用token_endpoint
,以交换令牌代码。id_token
:ID 令牌将从自定义标识提供者返回到 Azure AD B2C。
在“响应类型”中,根据标识提供者设置选择 code
或 id_token
。
在 <Item Key="response_types">
技术配置文件元数据中,根据标识提供者设置选择 code
或 id_token
。
响应模式
响应模式定义将数据从自定义标识提供者发送回 Azure AD B2C 时采用的方法。 可以使用以下响应模式:
form_post
:建议使用此响应模式以获得最佳安全性。 响应通过 HTTPPOST
方法传输,并使用application/x-www-form-urlencoded
格式将代码或令牌编码在正文中。query
:代码或令牌将作为查询参数返回。
在“响应模式”中,根据标识提供者设置选择 form_post
或 query
。
在 <Item Key="response_mode">
技术配置文件元数据中,根据标识提供者设置选择 form_post
或 query
。
域提示
域提示可用于直接跳转到指定标识提供者的登录页面,用户无需在可用标识提供者列表中进行选择。
若要允许这类行为,请输入域提示值。 若要跳转至自定义标识提供者,请在调用 Azure AD B2C 进行登录时将参数 domain_hint=<domain hint value>
追加至请求末尾。
在“域提示”中,输入域提示中使用的域名。
在 <Domain>contoso.com</Domain>
技术配置文件 XML 元素中,输入域提示中使用的域名。 例如,contoso.com
。
声明映射
在自定义标识提供者将 ID 令牌发送回 Azure AD B2C 之后,Azure AD B2C 需将接收到的令牌中的声明映射到 Azure AD B2C 识别并使用的声明。 对于以下每个映射,请参阅自定义标识提供者的文档,以了解标识提供者的令牌中返回的声明:
- 用户 ID:输入为已登录用户提供唯一标识符的声明。
- 显示名称:输入为用户提供显示名称或全名的声明。
- 名字:输入提供用户名字的声明。
- 姓氏:输入提供用户姓氏的声明。
- 电子邮件:输入提供用户电子邮件地址的声明。
OutputClaims
元素包含标识提供者返回的声明列表。 将策略中定义的声明名称映射到标识提供者中定义的名称。 在 <OutputClaims>
元素下,使用标识提供者定义的相应声明名称配置 PartnerClaimType
属性。
ClaimTypeReferenceId | PartnerClaimType |
---|---|
issuerUserId |
输入提供已登录用户唯一标识符的声明。 |
displayName |
输入提供用户的显示名或全名的声明。 |
givenName |
输入提供用户的名字的声明。 |
surName |
输入提供用户的姓氏的声明。 |
email |
输入提供用户的电子邮件地址的声明。 |
identityProvider |
输入提供令牌颁发者名称的声明。 例如,iss 。 如果标识提供者不在令牌中包含颁发者声明,请使用标识提供者的唯一标识符来设置 DefaultValue 属性。 例如,DefaultValue="contoso.com" 。 |
将标识提供者添加到用户流
- 在 Azure AD B2C 租户中,选择“用户流” 。
- 单击要添加标识提供者的用户流。
- 在“社交标识提供者”下,选择已添加的标识提供者。 例如,Contoso。
- 选择“保存”。
测试用户流
- 若要测试策略,请选择“运行用户流”。
- 对于“应用程序”,请选择前面已注册的名为“testapp1”的 Web 应用程序。 “回复 URL”应显示为
https://jwt.ms
。 - 选择“运行用户流”按钮。
- 在注册或登录页中,选择要登录的标识提供者。 例如,Contoso。
如果登录过程是成功的,则你的浏览器会被重定向到 https://jwt.ms
,其中显示 Azure AD B2C 返回的令牌内容。
添加用户旅程
此时,标识提供者已设置,但还不能在任何登录页中使用。 如果你没有自己的自定义用户旅程,请创建现有模板用户旅程的副本,否则,请继续执行下一步。
- 打开初学者包中的 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-OpenIdConnect" />
</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
)。
- 选择信赖方策略,例如
B2C_1A_signup_signin
。 - 对于“应用程序”,请选择前面注册的 Web 应用程序。 “回复 URL”应显示为
https://jwt.ms
。 - 选择“立即运行”按钮。
- 在注册或登录页面上,选择“Contoso”以登录。
如果登录过程成功,浏览器将重定向到 https://jwt.ms
,后者显示 Azure AD B2C 返回的令牌内容。
已知问题
- Azure AD B2C 不支持 JWE (JSON Web 加密) 与 OpenID 连接标识提供方交换加密令牌。
后续步骤
有关详细信息,请参阅 OpenID Connect 技术配置文件参考指南。