你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Active Directory B2C 自定义策略中定义 OAuth2 技术配置文件

重要

自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息

注释

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

Azure Active Directory B2C (Azure AD B2C) 提供对 OAuth2 协议标识提供者的支持。 OAuth2 是授权和委托身份验证的主要协议。 有关详细信息,请参阅 RFC 6749 OAuth 2.0 授权框架。 使用 OAuth2 技术配置文件,您可以与基于 OAuth2 的身份提供商(如 Facebook)联合。 与标识提供者联合允许用户使用其现有的社交或企业标识登录。

协议

“Protocol”元素的“Name”属性必须设置为 。 例如, Facebook-OAUTH 技术配置文件的协议为 OAuth2

<TechnicalProfile Id="Facebook-OAUTH">
  <DisplayName>Facebook</DisplayName>
  <Protocol Name="OAuth2" />
  ...

输入声明

InputClaimsInputClaimsTransformations 元素不是必需的。 但您可能希望向身份提供商发送更多参数。 以下示例将值为 contoso.com 查询字符串参数添加到授权请求。

<InputClaims>
  <InputClaim ClaimTypeReferenceId="domain_hint" DefaultValue="contoso.com" />
</InputClaims>

输出声明

OutputClaims 元素包含 OAuth2 身份提供商返回的声明列表。 可能需要将策略中定义的声明名称映射到标识提供者中定义的名称。 只要设置了 DefaultValue 属性,就还可以包含标识提供者不会返回的声明。

OutputClaimsTransformations 元素可能包含用于修改输出声明或生成新输出声明的 OutputClaimsTransformation 元素集合。

以下示例显示了 Facebook 身份提供商返回的声明:

  • first_name声明映射到 givenName 声明。
  • last_name声明映射到姓氏声明。
  • 不带名称映射的 displayName 声明。
  • 没有名称映射的 "email" 声明。

技术配置文件还会返回标识提供者不返回的声明:

  • 包含标识提供者名称的 identityProvider 声明。
  • authenticationSource 声明的默认值为 socialIdpAuthentication
<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="id" />
  <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="first_name" />
  <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="last_name" />
  <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
  <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
  <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="facebook.com" />
  <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
</OutputClaims>

授权终端节点元数据

当 Azure AD B2C 将用户定向到 OAuth2 标识提供者 /authorize 终结点时,授权流开始。 对授权终端节点的调用是流的交互部分,用户可以在其中执行作。 此时,系统会要求用户在 OAuth2 身份提供商处完成登录。 例如,通过输入他们的用户名和密码。

Azure AD B2C 通过提供客户端 ID、范围、重定向 URI 和从标识提供者处获取访问令牌所需的其他参数来创建授权请求。 本节介绍授权终端节点元数据,它允许配置对 /authorize 身份提供商终端节点的请求。

对授权终端节点的请求始终是 HTTP GET。 以下示例演示了对授权终端节点的调用。

GET https://login.contoso.com/oauth/v2/authorization?
client_id=12345
&response_type=code
&response_mode=query
&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
&scope=profile%20offline_access
&redirect_uri=https%3a%2f%2fabrikam.b2clogin.com%2fabrikam.onmicrosoft.com%2foauth2%2fauthresp
&state=...

下表列出了授权终端节点元数据。

特征 必选 DESCRIPTION
authorization_endpoint 是的 根据 RFC 6749 的授权端点的 URL。
client_id 是的 身份验证提供者的应用程序标识符。
AdditionalRequestQueryParameters 额外的请求查询参数。 例如,您可能希望将额外的参数发送到您的身份提供商。 您可以使用逗号分隔符包含多个参数。
response_mode 标识提供者在将结果发送回 Azure AD B2C 时使用的方法。 可能的值:queryform_post(默认值)或 fragment
scope 根据 OAuth2 身份提供商规范定义的请求范围。 例如 openidprofileemail
UsePolicyInRedirectUri 指示在构造重定向 URI 时是否要使用策略。 在标识提供者中配置应用程序时,需指定重定向 URI。 重定向 URI 指向 Azure AD B2C https://{your-tenant-name}.b2clogin.com/{your-tenant-name}.onmicrosoft.com/oauth2/authresp。 如果指定 true,需为每个使用的策略添加重定向 URI。 例如: https://{your-tenant-name}.b2clogin.com/{your-tenant-name}.onmicrosoft.com/{policy-name}/oauth2/authresp

令牌终端节点元数据

用户在标识提供者的授权终结点完成身份验证后,包含授权 code 的响应将返回到 Azure AD B2C。 Azure AD B2C 通过向 /token 标识提供者的终结点发送 POST 请求来兑换访问令牌的授权代码。 本节介绍令牌终端节点元数据,它允许配置对 /token 身份提供商终端节点的请求。

以下 HTTP 请求显示了对标识提供者的令牌终结点的 Azure AD B2C 调用。

POST https://contoso/oauth2/token 
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&client_id=12345&scope=profile offline_access&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq... 

下表列出了令牌终端节点元数据。

特征 必选 DESCRIPTION
AccessTokenEndpoint 是的 令牌端点的 URL。 例如,https://www.linkedin.com/oauth/v2/accessToken
HttpBinding 与令牌终端节点的预期 HTTP 绑定。 可能的值:GETPOST
AccessTokenResponseFormat 访问令牌终端节点调用的格式。 例如,Facebook 需要 HTTP GET 方法,但访问令牌响应采用 JSON 格式。 可能的值:DefaultJsonJsonP
ExtraParamsInAccessTokenEndpointResponse 包含某些身份提供商可在 AccessTokenEndpoint 的响应中返回的额外参数。 例如,来自 AccessTokenEndpoint 的响应包含一个额外的参数,例如 openid,该参数是 ClaimsEndpoint 请求查询字符串中除 access_token 之外的必需参数。 多个参数名称应进行转义,并用逗号 ',' 分隔符分隔。
token_endpoint_auth_method 指定 Azure AD B2C 如何向令牌终结点发送身份验证标头。 可能的值:client_secret_post(默认值)和 client_secret_basicprivate_key_jwt。 有关详细信息,请参阅 OpenID Connect 客户端身份验证部分
token_signing_algorithm 指定 token_endpoint_auth_method 设置为 private_key_jwt 时要使用的签名算法。 可能的值:RS256(默认值)或 RS512

配置 HTTP 绑定方法

默认情况下,对令牌终端节点的请求使用 HTTP POST。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">POST</Item>

以下 HTTP 调用演示了使用 HTTP POST 请求对令牌终端节点的调用:

POST /oauth2/token

client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

对于需要在端点上使用 HTTP GET 方法 /token 的身份提供者,请将 HttpBinding 元数据设置为 GET. 请注意,在以下示例中,the AccessTokenResponseFormat 设置为 json,因为令牌终端节点以 JSON 格式返回响应。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">GET</Item>
<Item Key="AccessTokenResponseFormat">json</Item>
GET /oauth2/token?client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

配置访问令牌响应格式

对于支持 HTTP POST 方法的身份提供程序,默认情况下 AccessTokenResponseFormat 设置为 json. 如果身份提供商支持 HTTP GET 请求,则必须将访问令牌响应格式设置为 json 显式。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">GET</Item>
<Item Key="AccessTokenResponseFormat">json</Item>

以下示例演示了 JSON 格式的令牌终端节点响应:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...",
    "token_type": "Bearer",
    "not_before": 1637924390,
    "expires_in": 960000,
}

配置鉴权方式

对令牌终端节点的请求始终需要身份验证。 默认情况下,Azure AD B2C 为标识提供者提供客户端凭据。 默认情况下,身份验证方法为 client_secret_post,包括请求正文中的客户端凭证 (client_idclient_secret)。

以下对令牌终端节点的 HTTP 请求在 POST 数据中包含 和 client_idclient_secret 对于 GET 请求 client_id ,并且 client_secret 包含在查询字符串参数中。

POST /oauth2/token

client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

对于需要在其 /token 端点上使用 HTTP 基本身份验证的身份提供者,请将 token_endpoint_auth_method 元数据配置为 client_secret_basic。 使用这种类型的身份验证方法,客户端凭证将使用 HTTP Basic 身份验证方案传递给身份提供商。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="token_endpoint_auth_method">client_secret_basic</Item>

以下 HTTP 请求演示了使用 HTTP 基本身份验证对令牌终端节点的调用。 授权标头包含客户端 ID 和客户端密钥,格式 client_ID:client_secret为 base64 编码。

POST /oauth2/token

Authorization: Basic YWJjZDoxMjM0

redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

对于支持私钥 JWT 身份验证的身份提供商,请将 token_endpoint_auth_method 元数据配置为 private_key_jwt. 使用这种类型的身份验证方法时,提供给 Azure AD B2C 的证书用于生成签名断言,该断言通过 client_assertion 参数传递给标识提供者。 设置为 client_assertion_typeurn:ietf:params:oauth:client-assertion-type:jwt-bearer. token_signing_algorithm元数据指定 JWT 的签名算法。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="token_endpoint_auth_method">private_key_jwt</Item>
<Item Key="token_signing_algorithm">RS256</Item>

以下 HTTP 请求演示了使用私钥 JWT 身份验证对令牌终端节点的调用。

POST /oauth2/token

client_assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjJFRFg0dWRYeDIxbXNoaXdJVzczMUY3OUZSbFJiUDZXVXJyZmktR1RFeVkifQ.eyJpc3MiOiJhYmNkIiwiZXhwIjoxNjM3OTI5ODY0LCJuYmYiOjE2Mzc5Mjk1NjQsImF1ZCI6Imh0dHBzOi8vNWRlNC0xMDktNjQtMTI0LTUzLm5ncm9rLmlvL2FjY2Vzc190b2tlbiIsImp0aSI6IjVxQWlGV2lEODNDbU1KWWNrejBRdGc9PSIsInN1YiI6ImFiY2QiLCJpYXQiOjE2Mzc5Mjk1NjR9.C4OtRnrLaQatpT5LP45O5Nb418S4v8yZi_C42ld440w&client_id=abcd&client_assertion_type=urn%3aietf%3aparams%3aoauth%3aclient-assertion-type%3ajwt-bearer&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

用户信息终端节点元数据

Azure AD B2C 从 OAuth2 标识提供者获取访问令牌后,它会调用用户信息终结点。 用户信息端点(也称为声明端点)旨在检索有关经过身份验证的用户的声明。 Azure AD B2C 使用 持有者令牌身份验证 向标识提供者用户信息终结点进行身份验证。 持有者令牌是 Azure AD B2C 从标识提供者 /token 终结点获取的访问令牌。

对用户信息端点的请求始终是 HTTP GET。 访问令牌在名为 access_token的查询字符串参数中发送。 以下 HTTP 请求显示对用户信息终端节点的调用,其中 access token 位于 query string 参数中。

GET /oauth2/claims?access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5... 

下表列出了用户信息终端节点元数据。

特征 必选 DESCRIPTION
ClaimsEndpoint 是的 用户信息终结点的 URL。 例如,https://api.linkedin.com/v2/me
ClaimsEndpointAccessTokenName 访问令牌查询字符串参数的名称。 默认值:access_token
ClaimsEndpointFormatName 格式查询字符串参数的名称。 例如,您可以设置名称,如此 LinkedIn 声明端点 https://api.linkedin.com/v1/people/~?format=json中所示format
ClaimsEndpointFormat format 查询字符串参数的值。 例如,您可以设置值,如此 LinkedIn 声明端点 https://api.linkedin.com/v1/people/~?format=json中所示json
BearerTokenTransmissionMethod 指定令牌的发送方式。 默认方法是查询字符串。 要将令牌作为请求标头发送,请设置为 AuthorizationHeader
ExtraParamsInClaimsEndpointRequest 包含某些标识提供者可在 ClaimsEndpoint 请求中返回的额外参数。 多个参数名称应进行转义,并用逗号 ',' 分隔符分隔。

配置 access token query string 参数

用户信息终端节点可能要求在特定查询字符串参数中发送访问令牌。 要更改包含访问令牌的查询字符串参数的名称,请使用 ClaimsEndpointAccessTokenName 元数据。 在以下示例中,访问令牌查询字符串参数设置为 token

<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="ClaimsEndpointAccessTokenName">token</Item>

以下 HTTP 调用演示了对 user info 端点的调用,并设置为 ClaimsEndpointAccessTokenNametoken

GET /oauth2/claims?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

配置声明格式

ClaimsEndpointFormatNameClaimsEndpointFormat 允许您将键值对查询字符串参数发送到用户信息终端节点。 以下示例配置名为 format的查询字符串参数,其值为 json.

<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="ClaimsEndpointFormatName">format</Item>
<Item Key="ClaimsEndpointFormat">json</Item>

以下 HTTP 请求演示了对用户信息终端节点的 ClaimsEndpointFormatName 调用 and ClaimsEndpointFormat configured.

GET /oauth2/claims?format=json&access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

配置 Bearer Token 传输方法

默认情况下,访问令牌通过查询字符串参数发送到身份提供商用户信息终端节点。 要在 HTTP Authorization 标头中发送令牌,请将 metadata 设置为 BearerTokenTransmissionMethodAuthorizationHeader.

<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="BearerTokenTransmissionMethod">AuthorizationHeader</Item>

以下 HTTP 请求演示了在设置为 AuthorizationHeaderBearerTokenTransmissionMethod如何传递访问令牌。

GET /oauth2/claims

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

传递令牌端点返回的参数

某些身份提供商需要将从令牌终端节点返回的额外参数传递给用户信息终端节点。 例如,来自 token 端点的响应包含一个名为 resource的参数,该参数是用户信息端点的必需参数(除了访问令牌之外)。 ExtraParamsInClaimsEndpointRequest使用元数据指定要传递的任何额外参数。 多个参数名称应进行转义,并用逗号 ',' 分隔符分隔。

以下 JSON 演示了令牌终端节点返回的 JSON 有效负载,其中包含名为 resource的参数。

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...",
    "token_type": "Bearer",
    "not_before": 1549647431,
    "expires_in": 960000,
    "resource": "f2a76e08-93f2-4350-833c-965c02483b11"
}

要将参数传递给 resource 用户信息端点,请添加以下元数据:

<Item Key="ExtraParamsInClaimsEndpointRequest">resource</Item>

以下 HTTP 请求演示了如何将 resource 参数传递到用户信息终端节点。

GET /oauth2/claims?resource=f2a76e08-93f2-4350-833c-965c02483b11&access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

结束会话端点

若要将用户从应用程序中注销,请将用户重定向到 Azure AD B2C 注销终结点 (适用于 OAuth2 和 OpenID Connect)或发送 ( LogoutRequest 适用于 SAML)。 Azure AD B2C 将从浏览器中清除用户的会话。 收到注销请求后,Azure AD B2C 会尝试从用户可能通过其登录的任何联合标识提供者注销。 OAuth2 身份提供商的注销 URI 在元数据中 end_session_endpoint 配置。 当用户通过 Azure AD B2C 注销应用程序时,将创建一个隐藏的 iframe,该 iframe 将在其 Azure AD B2C 注销页调用 end_session_endpoint

下表列出了用户信息终端节点元数据。

特征 必选 DESCRIPTION
end_session_endpoint 是的 根据 RFC 6749 的结束会话端点的 URL。
SingleLogoutEnabled 指示在登录过程中技术配置文件是否尝试从联合标识提供者注销。 有关详细信息,请参阅 Azure AD B2C 会话注销。可能的值:true(默认)或 false

OAuth2 通用元数据

下表列出了 OAuth2 身份提供商通用元数据。 元数据描述了 OAuth2 技术配置文件如何处理令牌验证、获取声明和对错误消息做出反应。

特征 必选 DESCRIPTION
IdTokenAudience id_token 的受众。 如果指定,Azure AD B2C 会检查令牌是否位于标识提供者返回的声明中,以及是否等于指定的令牌。
ProviderName 标识提供者的名称。
ResponseErrorCodeParamName 包含通过 HTTP 200 返回的错误消息的参数的名称 (Ok)。
IncludeClaimResolvingInClaimsHandling   对于输入和输出声明,指定声明解析是否包含在技术配置文件中。 可能的值:truefalse(默认值)。 若要使用技术配置文件中的声明解析程序,请将此项设为 true
ResolveJsonPathsInJsonTokens 指示技术配置文件是否解析 JSON 路径。 可能的值:truefalse(默认值)。 使用此元数据从嵌套 JSON 元素读取数据。 在 OutputClaimPartnerClaimType ,设置要输出的 JSON 路径元素。 例如:firstName.localizeddata[0].to[0].email

加密密钥

CryptographicKeys 元素包含以下属性:

特征 必选 DESCRIPTION
client_secret 是的 标识提供者应用程序的客户端机密。 仅当 response_types 元数据设置为 code时,才需要加密密钥。 在这种情况下,Azure AD B2C 会再次进行调用,以便用授权代码来交换访问令牌。 如果元数据设置为 id_token,则可以省略加密密钥。
assertion_signing_key token_endpoint_auth_method当元数据设置为 private_key_jwt时,请提供用于对 JWT 密钥进行签名的 X509 证书。 此密钥应由 OAuth2 身份提供商提供给您。

重定向 URI

配置标识提供者的重定向 URI 时,请输入 https://{tenant-name}.b2clogin.com/{tenant-name}.onmicrosoft.com/oauth2/authresp。 请确保替换为 {tenant-name} 租户的名称(例如 contosob2c)。 重定向 URI 需要采用全小写形式。