你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
重要
自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息。
访问令牌包含可在 Azure Active Directory B2C(Azure AD B2C)中使用的声明,用于标识对 API 的授予权限。 若要调用资源服务器,HTTP 请求必须包含访问令牌。 访问令牌在 Azure AD B2C 的响应中表示为 access_token 。
本文介绍如何请求 Web 应用程序和 Web API 的访问令牌。 有关 Azure AD B2C 中的令牌的详细信息,请参阅 Azure Active Directory B2C 中的令牌概述。
注释
Azure AD B2C 不支持 Web API 链(on-Behalf-Of) - 许多体系结构包括需要调用另一个下游 Web API 的 Web API,这两者均受 Azure AD B2C 保护。 此方案在具有 Web API 后端的客户端中很常见,后者又调用另一个服务。 可以使用 OAuth 2.0 JWT 持有者凭据授权(也称为代理流)来支持这种链接的 Web API 方案。 但是,On-Behalf-Of 流当前未在 Azure AD B2C 中实现。 尽管 On-Behalf-Of 适用于在 Microsoft Entra ID 中注册的应用程序,但不适用于在 Azure AD B2C 中注册的应用程序,无论颁发令牌的租户是 Microsoft Entra ID 还是 Azure AD B2C。
先决条件
- 创建用户流 ,使用户能够注册并登录到应用程序。
- 如果尚未这样做, 请将 Web API 应用程序添加到 Azure Active Directory B2C 租户。
范围
范围提供了管理受保护资源权限的方法。 请求访问令牌时,客户端应用程序需要在请求 的范围 参数中指定所需的权限。 例如,若要为具有应用 ID URIhttps://contoso.onmicrosoft.com/api
的 read
API 指定作用域值,范围将是https://contoso.onmicrosoft.com/api/read
。
Web API 使用权限范围来实现基于范围的访问控制。 例如,Web API 的用户可以同时具有读取和写入访问权限,或者 Web API 的用户可能只有读取访问权限。 若要在同一请求中获取多个权限,可以在请求的单个 范围 参数中添加多个条目,用空格分隔。
以下示例演示 URL 中解码的范围:
scope=https://contoso.onmicrosoft.com/api/read openid offline_access
以下示例显示了在 URL 中编码的范围:
scope=https%3A%2F%2Fcontoso.onmicrosoft.com%2Fapi%2Fread%20openid%20offline_access
如果请求的范围超出客户端应用程序授予的范围,则至少授予一个权限时,调用会成功。 生成的访问令牌中的 scp 声明仅填充成功授予的权限。
OpenID Connect 范围
OpenID Connect 标准指定多个特殊作用域值。 以下作用域表示访问用户个人资料的权限:
- openid - 请求 ID 令牌。
- offline_access - 使用授权代码流请求刷新令牌。
- 00000000-0000-0000-0000-000000000000 - 使用客户端 ID 作为范围,表明应用需要可用于自己的服务或 Web API 的访问令牌,由同一客户端 ID 表示。
如果请求中的response_type参数包括token
,则scope参数必须至少包含一个除了openid
和offline_access
之外将被授予的资源范围。 否则,请求 /authorize
将失败。
请求令牌
若要请求访问令牌,需要授权代码。 下面是向 /authorize
终结点请求授权代码的示例:
GET https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/authorize?
client_id=<application-ID>
&nonce=anyRandomValue
&redirect_uri=https://jwt.ms
&scope=<application-ID-URI>/<scope-name>
&response_type=code
按如下所示替换查询字符串中的值:
<tenant-name>
- Azure AD B2C 租户的名称。 如果使用自定义域,请将tenant-name.b2clogin.com
替换为你的域,例如contoso.com
。<policy-name>
- 自定义策略或用户流的名称。<application-ID>
- 注册以支持用户流的 Web 应用程序的应用程序标识符。<application-ID-URI>
- 在客户端应用程序的 “公开 API ”边栏选项卡下设置的应用程序标识符 URI。<scope-name>
- 在客户端应用程序的“公开 API”边栏选项卡下添加的范围的名称。<redirect-uri>
- 注册客户端应用程序时输入的 重定向 URI 。
若要大致了解请求的工作方式,请将该请求粘贴到浏览器中并运行它。
这是流程中的交互部分,您可以在这里进行操作。 系统会要求你完成用户流的工作流。 这可能涉及在登录表单或任何其他步骤中输入用户名和密码。 完成的步骤取决于如何定义用户流。
使用授权代码的响应应类似于以下示例:
https://jwt.ms/?code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
成功接收授权代码后,可以使用它来请求访问令牌。 参数位于 HTTP POST 请求的正文中:
POST <tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&client_id=<application-ID>
&scope=<application-ID-URI>/<scope-name>
&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
&redirect_uri=https://jwt.ms
&client_secret=2hMG2-_:y12n10vwH...
如果要测试此 POST HTTP 请求,可以使用任何 HTTP 客户端,例如 Microsoft PowerShell。
成功令牌响应如下所示:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrN...",
"token_type": "Bearer",
"not_before": 1549647431,
"expires_in": 3600,
"expires_on": 1549651031,
"resource": "f2a76e08-93f2-4350-833c-965c02483b11",
"profile_info": "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiJjNjRhNGY3ZC0zMDkxLTRjNzMtYTcyMi1hM2YwNjk0Z..."
}
使用 https://jwt.ms 检查返回的访问令牌时,应会看到类似于以下示例的内容:
{
"typ": "JWT",
"alg": "RS256",
"kid": "X5eXk4xyojNFum1kl2Ytv8dl..."
}.{
"iss": "https://contoso0926tenant.b2clogin.com/c64a4f7d-3091-4c73-a7.../v2.0/",
"exp": 1549651031,
"nbf": 1549647431,
"aud": "f2a76e08-93f2-4350-833c-965...",
"oid": "1558f87f-452b-4757-bcd1-883...",
"sub": "1558f87f-452b-4757-bcd1-883...",
"name": "David",
"tfp": "B2C_1_signupsignin1",
"nonce": "anyRandomValue",
"scp": "read",
"azp": "38307aee-303c-4fff-8087-d8d2...",
"ver": "1.0",
"iat": 1549647431
}.[Signature]
后续步骤
- 了解如何 在 Azure AD B2C 中配置令牌