Azure AD B2C:客户端在兑换机密授权时必须发送client_secret。

22

我尝试为一个Angular应用程序使用授权码和Azure AD B2C (客户端使用oidc-client)设置身份验证,但是我从Angular获取了这些错误信息:

输入图像描述

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

当赎回机密授予时,客户端必须发送client_secret。

这是我的客户端配置:

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实例,一切都按预期工作。

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


2
谁将为您兑换代码?我猜您正在使用SPA并尝试集成Auth Code流程。如果您正在使用SPA,则必须使用隐式流。B2C正在显示client_secret是必需的,因为它需要该值来兑换代码。请将response_type值替换为“token”,然后查看它的作用。 - Ramakrishna
1
B2C目前支持原生应用程序的PKCE流程,但不支持Web。原生应用程序可以使用PKCE流程兑换授权代码,但Web应用程序不能。 - Ramakrishna
5个回答

35

我曾经遇到了和你一模一样的问题,现在我已经解决了。

AD要求你提供client_secret,因为它还没有为PKCE进行配置。为了告诉AD你想要使用PKCE来处理特定的重定向url,你需要将其类型从'Web'更改为'Spa'。这可以在清单中完成。

在清单中搜索replyUrlsWithType属性,查找你的.../signin-callback url。将其类型更改为'Spa',然后你就可以正常使用了。

eg.:

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

配置的url现在将从您的授权页面中消失,但没关系 -> 它仍然存在于清单中。Microsoft团队正在研究这种新类型。
还要确保将应用程序标记为公共客户端。
有关更多信息,请参见我的答案:Active Directory是否不支持带有PKCE的授权代码流程?

13
在Azure AD B2C应用程序中,现在有一个更简单的选项来实现这一点。在身份验证选项卡中,Web重定向URI所在的位置可能会看到一条消息此应用启用了隐式授权设置。如果您正在使用MSAL.js 2.0中的任何这些URI进行SPA,则应迁移URIs。当您单击它时,将会弹出一个新窗口,让您选择要将哪个重定向URI移动到SPA重定向URI中:

迁移到单页应用程序(SPA)

之后只需点击配置,就可以工作了。重定向URI现在将位于SPA部分而不是Web部分。

输入图像描述


0

你的图片显示了一个CORS错误。

我不确定oidc-client是否能够与B2C开箱即用。它更适合用于identityserver。

看一下msal.js样例


谢谢,我知道MSAL。我以为oidc-client可以与任何STS一起使用? - Maxime Gélinas

0

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

据我所知,Azure AD不允许跨域调用令牌端点,因此不支持SPAs在2019年应该使用的授权码流(PKCE)。

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

出于兴趣,我写了几篇关于Azure SPA解决方法的文章,这些内容可能仍然相关: https://authguidance.com/2017/11/30/azure-active-directory-setup/


当我在https://supportodqqcdev.b2clogin.com/supportodqqcDev.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_SignUpSignInOdqPlatine获取已知的配置时,code包含在支持的响应类型中。这并不意味着支持授权码流程吗? - Maxime Gélinas
理论上应该可以,但是存在差异。你可能会发现msal.js不能与identityserver OOTB正常工作。此外,我认为MSAL.js使用隐式流而不是授权代码授予。 - rbrayb
@MaximeGélinas,你不应该为SPA应用程序使用Auth Code流程,B2C支持从SPA应用程序进行Auth Code流程,但我们不应该使用它,因为存在高安全风险(风险在于,您需要在客户端脚本中公开客户端ID和密钥,任何人都可以轻松地从Web上读取它)。 - Ramakrishna
1
@Ramakrishna Authz Code Flow是SPA的新方式。自2019年夏季以来,隐式流已被弃用。请参见:https://www.pluralsight.com/courses/openid-and-oauth2-securing-angular-apps。 - Maxime Gélinas
所以最坏的情况下,将响应类型设置为token id_token,你的应用程序就可以正常工作了 - 就像我的示例一样。这不会影响SPA其他部分的代码:https://github.com/gary-archer/authguidance.websample.azure/blob/master/spa/src/plumbing/oauth/authenticator.ts - Gary Archer
显示剩余4条评论

0
在一些评论中,我看到有人说“ADB2C目前支持原生应用的PKCE流程,但不支持Web”,我知道这个讨论帖有点老了,但我想告诉大家,目前建议所有应用程序都使用PKCE,包括Web应用程序。

来源

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接