我正在尝试使用 PKCE 一个有角度的项目来实现授权代码流。我正在使用 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 复选框。我在这里缺少什么?
根据 Microsoft 文档:GetAccessToken
您需要在范围内添加应用程序ID。
不要使用scope: 'openid profileoffline_access',而是使用:scope:'openidprofileoffline_accessAPPID'
示例:范围:'openid 配置文件offline_access 64d188a5-f9a4-4b8e-9dcd-d9c9f48ea01f'
除非您明确请求对某个 API 的权限,否则它不会自动返回 AccessToken。
当您开始使用 B2C 时,这是一个容易陷入的陷阱。
要获得
access_token
,您必须访问 Azure AD B2C 门户并为您的客户端应用程序公开 API。
这意味着:
当使用我的身份验证库 (@azure/msal-browser@2.1) 尝试使用 PKCE 的身份验证代码流程时,我发现在幕后它总是与 https://login.microsoftonline.com/common/ 配合得很好 我不需要为访问令牌付出任何额外的努力。在切换到我们公司的 Azure Active Directory B2C 后,这种行为发生了变化,并且它不会自动返回
access_token
,除非我明确请求对我们的 API 之一的权限。
从好的方面来看,还值得一提的是,使用 Azure AD B2C 时,使用 PKCE 的身份验证代码流运行良好,尽管据我所知,它尚未经过生产测试(请参阅此 GitHub 问题)。
不包含访问令牌,因为您没有请求访问某些内容。
您需要在此处传递一些额外的范围:
scope: 'openid profile offline_access',
以上答案是正确的,但也要确保您已在 API 权限下的应用程序注册中授予同意。如果是这种情况,状态列应显示。就我而言,如其他答案中所述,范围设置正确,但未返回访问令牌。