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 应用程序注册中的 Client Secret 最长到期时间修改为 2 年