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

在 Azure Active Directory B2C 中请求访问令牌

重要

自 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。

先决条件

范围

范围提供了管理受保护资源权限的方法。 请求访问令牌时,客户端应用程序需要在请求 的范围 参数中指定所需的权限。 例如,若要为具有应用 ID URIhttps://contoso.onmicrosoft.com/apiread 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参数必须至少包含一个除了openidoffline_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]

后续步骤