触发从“Keycloak”到“Azure ADB2C”的基本 http 调用以进行令牌响应时出错

Posted

技术标签:

【中文标题】触发从“Keycloak”到“Azure ADB2C”的基本 http 调用以进行令牌响应时出错【英文标题】:Getting error while triggering a basic http call from ‘Keycloak’ to ‘Azure ADB2C’ for token response 【发布时间】:2022-01-16 01:37:51 【问题描述】:

在从“Keycloak”向“Azure ADB2C”进行基本 http 调用以检索令牌作为来自 AD B2C 的响应时。

当前流程如下所示。对于与“Keycloak”集成作为身份代理的 Java Web 应用程序,并且从“Keycloak”中,我们已与“Azure AD B2C”集成作为用户身份验证的身份提供程序,并将令牌响应发送回 keycloak请求。

用例 1:我们在 keycloak 中集成了一个 Azure ADB2C 登录用户流端点,它将登录请求发送到 b2c 并检索令牌作为来自 Azure b2c 的响应。

用例 2:在此用例中有一个阻止程序,在从“Keycloak”向“Azure AD B2C”进行基本 http 标头调用时,我们在“keycloak”日志中看到错误代码为“Invalid_grant”, invalid_secret 和 'Invalid_credentials' 来自 keycloak 的不同调用。在 Azure ADB2C 端进行验证后,我们没有找到任何来自“Keycloak”的上述请求的日志。

是否需要在 keycloak 中进行任何变通或更改才能处理对 Azure ADB2C 的基本 http 调用?

谢谢!!

【问题讨论】:

您向哪个端点发出“基本 http 标头调用”请求?请求是什么样的?你为什么要发送这样的请求? 所以,这里 keycloak 正在处理来自客户端应用程序的用户登录请求,我试图通过基本身份验证调用将用户凭据传递给 B2C,以从 b2c 检索令牌响应,而不是向用户显示登录屏幕。在这种情况下,从 Keycloak 调用 B2C 无头身份验证端点。我不确定为什么 keycloak 在这种情况下会面临身份验证挑战。不确定 B2C 是否支持来自外部应用程序的 http 基本身份验证调用,而不是来自 SignIn 端点或 ROPC 端点的登录请求。 例如,有一个客户端应用程序 A 和 B。如果应用程序 A 想要通过对 B2C 的 http 基本身份验证调用来对用户进行身份验证,以通过调用无头端点获取访问令牌作为响应,这现在出现错误。但是,从应用程序 B,我能够将 B2C 登录用户流端点与客户端应用程序集成,其中 keycloak 能够在 B2C 中成功进行用户身份验证后检索令牌。要通过无头身份验证 url 触发 http 基本身份验证调用,客户端应用程序是否需要进行任何配置更改?... 【参考方案1】:

对于客户端到客户端的调用,Azure AD B2C 支持client_credntial 流: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow

您可以在基本身份验证标头中发送client_idclient_secret 参数。

【讨论】:

感谢您的输入,在此 client_credentials 流程中,不会涉及任何用户。我尝试使用基本的 http 标头调用通过 keycloak 调用登录流端点和 ROPC 端点,但请求仍然没有到达 b2c。此外,我是否必须在 B2C 中启用任何选项,以便在调用 B2C ROPC 或登录端点时允许此 http 基本身份验证请求?。 您必须使用链接中的端点,是的,不会涉及任何用户。 B2C ROPC 将不起作用,除非您在正文中传递参数。 嗨,贾斯·苏瑞。以上建议的客户端凭据流从 b2c 获取令牌,使用来自外部应用程序的令牌来触发图形端点以创建用户、更新用户和删除用户工作正常。但是,这个客户端凭据流是否也支持“用户身份验证”? ... 从外部应用程序尝试从 keycloak 到 b2c 进行 http 基本身份验证调用,但没有收到 b2c 的请求,或者 b2c 审计日志中也没有记录日志。对于从 keycloak 发出 http 基本身份验证请求的外部应用程序,有关此方案的任何建议都会有所帮助。 你为什么要这样做? OAuth2 标准中没有真正描述您正在尝试做的事情。客户端凭证流用于服务器获取令牌。对于用户上下文中的令牌,您必须使用交互式流(OpenId Connect、授权码流、隐式流)或非交互式流(ROPC 流 - 不支持服务器到服务器)。除了 client_credential 之外,这些流都不支持 HTTP Basic 标头。所以,简短的回答,不,你不能做你想做的事,它不是真正的标准。

以上是关于触发从“Keycloak”到“Azure ADB2C”的基本 http 调用以进行令牌响应时出错的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD 作为 Azure ADB2C 的 OpenID Connect 提供程序

使用 Azure AD 作为身份提供者的 Azure ADB2C 单点注销

Keycloak:订阅诸如创建用户之类的事件以触发网络服务

Keycloak - 密码重置后自动登录

从 Spring Boot 安全迁移到 keycloak

如何从外部 IDP 读取/导入角色到 Keycloak