【问题标题】:B2C authentication not returning access_tokenB2C 身份验证未返回 access_token
【发布时间】:2020-12-17 01:35:06
【问题描述】:

我正在尝试使用 PKCE 一个 Angular 项目来实现授权代码流。我正在使用 angular-auth-oidc-client。我们已经有一个现有的基于 IdentityServer4 的内部实现,客户端可以很好地与之对抗,但我们现在正尝试将我们的身份验证迁移到 Azure AD B2C,而不是在内部实现。

我已配置 Azure AD B2C 和我的客户端应用程序。这是配置:

这是我在客户端 OIDC 服务上的配置:

oidcConfigService.withConfig({
    stsServer: 'https://login.microsoftonline.com/mycompany.onmicrosoft.com/v2.0',
    authWellknownEndpoint:
        'https://mycompany.b2clogin.com/mycompany.onmicrosoft.com/B2C_1_SignUpSignIn/v2.0/.well-known/openid-configuration',
    redirectUrl: window.location.origin,
    postLogoutRedirectUri: window.location.origin,
    clientId: 'client-id-guid-goes-here',
    scope: 'openid profile offline_access',
    responseType: 'code',
    silentRenew: true,
    autoUserinfo: false,
    silentRenewUrl: window.location.origin + '/silent-renew.html',
    logLevel: LogLevel.Debug,
    renewTimeBeforeTokenExpiresInSeconds: 60
});

问题:在令牌响应中没有访问令牌:

即使我在客户端配置中选中了 accesss_token 复选框。我在这里错过了什么?

【问题讨论】:

  • 你要调用什么API?微软图形?我没有看到您为任何资源或范围请求访问令牌。只是登录吗?
  • scope: 'openid profile offline_access', 未指定您要调用的 API。
  • 当我在scope中指定api scope和openid时,我只收到了'id_token',没有收到access-token。我不得不从范围中删除 openid 。见docs.microsoft.com/en-us/answers/questions/135912/…

标签: openid-connect azure-ad-b2c access-token pkce angular-auth-oidc-client


【解决方案1】:

它不会自动返回 AccessToken,除非您明确请求对其中一个 API 的权限。

当您开始使用 B2C 时,这是一个容易陷入的陷阱。

要获得access_token,您必须访问 Azure AD B2C 门户并为您的客户端应用公开一个 API。 这意味着:

  • 为您的 API 添加自定义范围
  • 将范围添加为您应用的 API 权限
  • 调整客户端上的登录配置以使用此范围

当使用我的身份验证库 (@azure/msal-browser@2.1) 尝试使用 PKCE 的身份验证代码流时,我发现在幕后它总是与https://login.microsoftonline.com/common/ 配合得很好,而且我不必为访问令牌。在切换到我们公司的 Azure Active Directory B2C 后,这种行为发生了变化,并且它不会自动返回 access_token,除非我明确请求对我们的一个 API 的权限。

虽然还值得一提的是,在使用 Azure AD B2C 时,带有 PKCE 的 Auth 代码流运行良好,但据我所知,它还没有经过生产环境的实战测试 (see this GitHub issue)。

【讨论】:

    【解决方案2】:

    根据微软文档:GetAccessToken

    您需要在范围内添加App ID。

    代替范围:'openid profile offline_access',使用:范围:'openid profile offline_access APPID'

    示例:范围:'openid profile offline_access 64d188a5-f9a4-4b8e-9dcd-d9c9f48ea01f'

    【讨论】:

      【解决方案3】:

      不包括访问令牌,因为您没有请求访问某些内容。

      你需要在这里传递一些额外的范围:

      scope: 'openid profile offline_access',
      

      【讨论】:

      • 谢谢。解决了。一旦我通过了额外的范围,就会返回 access_token。
      猜你喜欢
      • 2016-04-26
      • 2021-06-01
      • 1970-01-01
      • 2019-06-25
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2017-04-24
      相关资源
      最近更新 更多