针对 Azure OIDC OAuth2 流的 Spring Security

Posted

技术标签:

【中文标题】针对 Azure OIDC OAuth2 流的 Spring Security【英文标题】:Spring Security against Azure OIDC OAuth2 Flow 【发布时间】:2018-09-29 05:18:54 【问题描述】:

我本可以问真正的问题,为什么我在对授权端点的响应中只得到一个 id_token?而且,可能最好在 azure *** 空间中创建。

就上下文而言,最初的问题更多是关于定制策略。这一点,进一步的研究确定是没有必要的。

我一直在阅读 Spring Security 参考指南的 OAuth2/OIDC 功能 - 5.7 OAuth 2.0 Login、31. OAuth 2.0 Login — Advanced Configuration 和 github OAuth2 Login Samples,试图弄清楚如何为 Microsofts Azure 扩展或创建自定义实现OIDC API - Authorize access to web applications using OpenID Connect and Azure Active Directory。

这些是观察结果。一般来说,我根据我的实验所看到的,以及基于 spring 安全行为和 Microsoft 理解 OpenID Connect 协议指南文档我认为是真实的。

Azure 针对 /authorization 端点的登录请求对其登录请求有 3 个额外的细微差别,这些细微差别目前在 Spring Security 5 代码库中不受支持。

“response_type”——Microsoft OIDC API 允许 id_token 或 id_token+code ... Spring Security 支持“code”或“token”OOTB。 (id_token 为您获取 id_toke,id_token+code 将为您获取 id_toke 和代码。您可以交换访问令牌的代码。 “response_mode” – Microsoft OIDC API 建议使用 response_mode=form_post ... OOTB Spring Security 不支持。 “nonce” - Microsoft OIDC API 建议使用 nonce=[unique_value] ... OOTB Spring Security 不支持。

我创建了一个分支来查看需要哪些增强功能来支持上述内容。我相信他们会的。

spring-security-oauth2-core

OAuth2AuthorizationResponseType - 包括其他类型。

OAuth2AuthoriztionRequest - 包括对 nonce 和 responseMode 的支持

oauth2-client

OAuth2AuthorationRequestRedirectFilter

OAuth2AuthorizationRequestUriBuilder

And a mechanism to auto configure the appropriate options.

乍一看,支持这些参数的更改似乎微不足道。但是,spring security 中的类是 final 的,因此扩展要大得多。

有人对定制策略有什么建议吗?在不复制代码库的情况下创建自定义配置以支持细微差别的推荐方法是什么?

【问题讨论】:

最好的办法是分叉和拉取,让项目维护人员回答这些问题。或者直接问他们。否则,这是对设计的广泛要求,不适合 SO Q&A 格式。 如何创建自定义版本的 OAuth2AuthenticationRequestRedirectFilter 和包含对新字段的支持的新版本 AzureOAuth2AuthorizationRequestBuilder?我有点担心HttpSessionOAuth2AuthorizationRequestRepository的序列化和使用的效果。 response_type=code 是否受支持?无论如何,在交换代码时,您都会获得一个 Id 令牌、访问令牌和刷新令牌。 juunas - 谢谢你的花絮。我的痛苦是在我注册我的应用程序时发现我的 Azure B2C 配置中没有包含 API 范围 - 唯一的范围是 oidc。因为,没有 API 范围 Azure 足够聪明,只能基于“oidc”范围返回“id_token”......在进行故障排除时,这导致错误提示生成的 json 缺少授权代码。一旦我添加了一个应用程序范围,一切都很好。 OOTB 配置也有效。 nonce 和 reply_mode 参数是可选的。 jdv,谢谢。你说的对。我已经改写了这个问题。 【参考方案1】:

有了 juunas 的线索......我意识到我的问题与我在 azure b2c 刀片中注册我的应用程序时没有创建 api 范围的事实有关。因此,问题不在于弹簧安全配置。但是,缺少范围的结果。

顺便说一句,Microsoft 了解 OpenID 连接协议指南中的获取访问令牌部分指出,“...通过在请求中包含权限范围并使用 response_type=code+id_token,授权端点确保用户已同意权限在范围查询参数中指示,并返回您的应用程序授权码以交换访问令牌。”

根据 juunas,当 response_type=code 时也会发生这种情况。 ——

【讨论】:

以上是关于针对 Azure OIDC OAuth2 流的 Spring Security的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 OIDC(OAuth2)客户端/资源服务器未在 WebClient 中传播访问令牌

没有 OIDC 的 OAuth2.0(普通 OAuth2.0)

Angular 5 + OAuth2:未使用库设置令牌 [angular-oauth2-oidc]

OIDC - 使用 IdentityServer3 和 Spring Boot 实现 OAuth2

WSO2 IS - OAuth2 / OIDC提供相同的令牌

OIDC-基于OAuth2的下一代身份认证授权协议