B2C身份验证未返回access_token

时间:2020-08-28 06:05:50

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

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

我已经配置了Azure AD B2C和客户端应用程序。配置如下: My app configuration

这是我在客户端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
});

问题:令牌响应中没有访问令牌: No access_token

即使我已经在客户端配置中选中了accesss_token复选框。我在这里想念什么?

3 个答案:

答案 0 :(得分:1)

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

当您开始使用B2C时,这是一个容易犯的错误。

要获取access_token,必须访问Azure AD B2C门户并公开用于客户端应用程序的API。 这意味着:

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

API Permissions

在我的身份验证库(@azure/msal-browser@2.1)中尝试使用PKCE进行身份验证代码流时,我发现在幕后它始终可以与https://login.microsoftonline.com/common/一起很好地使用,而我不必插入访问令牌的任何额外工作。切换到公司的Azure Active Directory B2C后,此行为发生了变化,除非我明确请求对其中一个API的许可,否则它不会自动返回access_token

从好的方面来说,尽管值得一提的是,使用Azure AD B2C时使用PKCE的Auth Code Flow可以正常工作,尽管据我所知,它尚未经过生产测试(see this GitHub issue)。 / p>

答案 1 :(得分:0)

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

您需要在此处传递一些其他范围:

scope: 'openid profile offline_access',

答案 2 :(得分:0)

根据 Microsoft Docs:GetAccessToken

您需要在范围内添加应用 ID

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

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