使用 Keycloak 作为 Azure AD 的身份代理授予客户端凭据

Posted

技术标签:

【中文标题】使用 Keycloak 作为 Azure AD 的身份代理授予客户端凭据【英文标题】:Client Credentials grant with Keycloak as an identity broker for Azure AD 【发布时间】:2021-10-08 02:41:19 【问题描述】:

我正在尝试将客户端凭据授予使用 Keycloak 作为 Azure AD 的身份代理的后端服务。我还需要将来自外部 IdP 的访问令牌存储在 Keycloak 中,以从 MS Graph API 检索组信息。我有这个用例为使用授权代码流的机密客户端工作,但我无法让它与客户端凭据授权一起使用。

我在 Keycloak 中创建了一个启用了“服务帐户启用”的“机密”客户端。我还在 Azure AD 中创建了一个启用了客户端凭据授予的应用程序,并在 Keycloak 中创建了一个外部身份提供程序。

在使用 client_id 和 client_secret 进行身份验证后,我从 Keycloak 获取访问令牌,但是当我尝试从 Keycloak 端点检索外部 IdP 访问令牌时,我收到一条错误消息,提示“用户 [GUID] 与身份提供者没有关联” .如有任何建议或反馈,我将不胜感激。

【问题讨论】:

您是否尝试使用服务帐户的凭据进行身份验证?该服务帐户在 Azure AD 中既不存在,在 AD 中也没有关联帐户。你能详细说明你想要达到的目标吗? @sventorben,是的,我正在尝试使用服务帐户的凭据进行身份验证,并且我已验证 Azure AD 服务帐户(cliend_id 和 client_secret)存在并且可以正常工作。我想使用 Keycloak 作为 Azure AD 的身份代理,并且我想在双方都使用客户端凭据授予(即服务应用程序 -> Keycloak -> Azure AD)。我还想将 Azure AD 中的访问令牌存储在 Keycloak 中,然后从 Keycloak 中检索它以向 Graph API 发出请求。 抱歉,我认为这不可能。 @sventorben 你能解释一下为什么这是不可能的吗? 客户端凭据授权类型被客户端用来获取访问令牌。这完全超出了用户的上下文。在这种情况下,Keycloak 不会将请求转发或重定向到 AD。因此,永远不会有 AD 代币。如果您需要客户端凭据授权从 AD 发出令牌,则需要直接向 AD 发出请求。 【参考方案1】:

感谢Sventorben 发布您的建议作为帮助其他社区成员的答案。

虽然 Azure AD 和 Keycloak 都授予客户端凭据,但无法将来自 Azure AD 的访问令牌存储在 Keycloak 中,然后从 Keycloak 检索它以向 Graph API 发出请求。

客户端使用客户端凭据授予类型来获取访问令牌。这完全超出了用户的上下文。在这种情况下,Keycloak 不会将请求转发或重定向到 AD。因此,永远不会有 AD 代币。如果您需要客户端凭据授权从 AD 发出令牌,则需要直接向 AD 发出请求。

从下面的文档看来,Keyclock 是代理,它不应该发送从 Azure AD 接收的原始访问令牌来访问 Graph API。只有您可以使用启用 StoredTokens Readable 开关读取令牌。

参考:https://wjw465150.gitbooks.io/keycloakdocumentation/content/server_admin/topics/identity-broker/tokens.html

【讨论】:

以上是关于使用 Keycloak 作为 Azure AD 的身份代理授予客户端凭据的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 KeyCloak 为一组 webapp 配置 2 个不同的 SSO (AD)?

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

使用 Azure AD B2C 作为服务进行身份验证

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

Azure AD 的 LogoutResponse 证书问题

Azure-AD B2C 可以使用手机号码作为用户名吗?