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

Posted

技术标签:

【中文标题】Azure AD B2C:客户在兑换机密授权时必须发送 client_secret【英文标题】:Azure AD B2C: Clients must send a client_secret when redeeming a confidential grant 【发布时间】:2020-03-28 12:28:02 【问题描述】:

我尝试使用授权代码和 Azure AD B2C(客户端上的 oidc-client)为 Angular 应用程序设置身份验证,但我从 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 实例,一切正常。

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

【问题讨论】:

谁会为您兑换代码?我猜您正在使用 SPA 并尝试集成身份验证代码流。如果您使用的是 SPA,那么您必须使用隐式流。 B2C 显示 client_secret is must 因为它需要它来兑换代码。用 'token' 替换 response_type 值,看看它在做什么 B2C 目前支持原生应用程序的 PKCE 流,但不支持 Web。原生应用程序可以使用 PKCE 流而不是 Web 应用程序来兑换身份验证代码。 【参考方案1】:

您的图片显示 CORS 错误。

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

看看msal.js sample。

【讨论】:

谢谢,我知道 MSAL。我认为 oidc-client 正在使用任何 STS?【参考方案2】:

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

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

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

几年前,出于兴趣,我在 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 包含在支持的响应类型中。不支持授权码流? 理论上应该是应该的,但还是有区别的。您可能会发现 msal.js 无法与身份服务器一起使用 OOTB。另外,我认为 MSAL.js 使用隐式流而不是授权码授予。 @MaximeGélinas,您不应该对 SPA 应用程序使用身份验证代码流,开箱即用的 B2C 支持来自 SPA 应用程序的身份验证代码流,但我们不应该使用它,因为安全风险很高(风险是因为,您需要在客户端脚本中公开客户端 ID 和密码,任何人都可以轻松地从网络上读取)。 @Ramakrishna Authz Code Flow 是 SPA 的新方式。自 2019 年夏季起,隐式流已被弃用。请参阅:pluralsight.com/courses/openid-and-oauth2-securing-angular-apps。 明确一点 - 建议 SPA 使用授权代码流 (PKCE),Maxime 的代码看起来完全正确。但 Azure AD 错误地阻止了对令牌终结点的请求。我的目标是通过后端 API 将请求双跳到令牌端点来解决它。当我有时间时,我会更新我的示例以执行此操作。【参考方案3】:

我遇到了和你一样的问题,只是能够解决它。

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

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

例如:

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

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

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

欲了解更多信息,请在此处查看我的回答:Is Active Directory not supporting Authorization Code Flow with PKCE?

【讨论】:

【参考方案4】:

在 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。当您单击它时,一个新窗口将让您选择要移动到 SPA 重定向 URI 的重定向 URI:

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

【讨论】:

以上是关于Azure AD B2C:客户在兑换机密授权时必须发送 client_secret的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD B2C FedRAMP是否获得授权?

Azure AD B2C 图形 API 401 未经授权

Azure AD 应用程序注册中的 Client Secret 最长到期时间修改为 2 年

Azure AD 应用程序注册中的 Client Secret 最长到期时间修改为 2 年

无头认证Azure AD b2c

是否可以强制禁用 Azure AD B2c 中的访问令牌?