Azure AD B2C:客户在兑换机密赠款时必须发送 client_secret

Azure AD B2C: Clients must send a client_secret when redeeming a confidential grant

我尝试使用授权码和 Azure AD B2C(客户端的 oidc-client)为 Angular 应用程序设置身份验证,但我从 Angular 收到这些错误:

查看 B2C 审计日志后,我发现了这条错误消息:

Clients must send a client_secret when redeeming a confidential grant.

这是我的客户端配置:

const settings = {
  stsAuthority: 'https://supportodqqcdev.b2clogin.com/supportodqqcDev.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_SignUpSignInOdqPlatine',
  clientId: '8447df5b-35a0-40a7-944f-5dcce87a2193',
  clientRoot: 'https://localhost:4200',
  scope: 'openid https://supportodqqcDev.onmicrosoft.com/platineclientdev/read',
};
this.userManager = new UserManager({
  authority: settings.stsAuthority,
  client_id: settings.clientId,
  redirect_uri: `${settings.clientRoot}/signin-callback`,
  scope: settings.scope,
  response_type: 'code',
  post_logout_redirect_uri: `${settings.clientRoot}/signout-callback`,
  automaticSilentRenew: true,
  silent_redirect_uri: `${settings.clientRoot}/assets/signin-silent-callback.html`,
});

如果我将上述配置切换为使用本地 IdentityServer 实例,一切正常。

有人能指出我应该在哪里或如何调查这个问题吗?

您的图像显示 CORS 错误。

我不确定 oidc-client 是否适用于 B2C 的 OOTB。它更多用于身份服务器。

看看msal.js sample

我怀疑您的代码没有问题,但是...

我最后听说,Azure AD 不允许对令牌端点进行跨源调用 - 因此不支持 SPA 应在 2019 年使用的授权代码流 (PKCE)。

除非我弄错了,否则这意味着您在与 Azure AD 集成时需要使用(不推荐的)隐式流。 SPA 几年来一直存在问题。

出于兴趣,我在几年前写了一些关于 Azure SPA 工作区的帖子 - 我怀疑其中一些仍然相关: https://authguidance.com/2017/11/30/azure-active-directory-setup/

我遇到了与您完全相同的问题,并且能够解决它。

AD 正在向您请求 client_secret,因为它尚未针对 PKCE 配置。要告诉 AD 您想要将 PKCE 用于特定的重定向 url,您需要将其类型从 'Web' 设置为 'Spa'。这可以在清单中完成。

在清单中搜索 属性 replyUrlsWithType 并查找您的 .../signin-callback url。将其类型更改为 'Spa',你应该会很好。

例如:

"replyUrlsWithType": [
    {
        "url": "http://localhost:8080/signin-callback",
        "type": "Spa"
    },
]

配置的 url 现在将从您的授权页面中消失,但没关系 -> 它仍然存在于清单中。 MS 团队正在研究这种新类型。

还要确保将您的应用程序标记为 public 客户端。

有关更多信息,请在此处查看我的回答:

在 Azure AD B2C 应用程序中,现在有一个更简单的选项可以执行此操作。在 Web 重定向 URI 所在的身份验证选项卡中,您可能会看到一条消息 This app has implicit grant settings enabled. If you are using any of these URIs in a SPA with MSAL.js 2.0, you should migrate URIs。当您单击它时,一个新的 window 将让您选择要移动到 SPA 重定向 URI 的重定向 URI:

之后只需单击 Configure 即可。重定向 URI 现在将位于 SPA 部分而不是 Web 部分。

在一些评论中,我将其解读为 'ADB2C currently supporting PKCE flow for Native Applications but not for Web',我知道这是一个有点老的讨论话题,但我只是想告知目前 PKCE 被推荐用于包括 Web 应用程序在内的所有应用程序。

Source