ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

oauth2-proxy 接入 Microsoft ADFS:基于 OIDC 的登录流程、代理配置与 Cookie 会话排障

oauth2-proxy 接入 Microsoft ADFS:基于 OIDC 的登录流程、代理配置与 Cookie 会话排障 oauth2-proxy 接入 Microsoft ADFS基于 OIDC 的登录流程、代理配置与 Cookie 会话排障【免费下载链接】oauth2-proxyA reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.项目地址: https://gitcode.com/GitHub_Trending/oa/oauth2-proxy本篇指南基于 oauth2-proxy 官方文档7.11.x 版本的 ADFS 提供商文档展开介绍如何在 Windows Server 的 ADFS 管理控制台中创建应用、如何通过--provideradfs完成 oauth2-proxy 的接入配置并结合仓库源码解析 ADFSProvider 的双重编码、upn声明回退等关键实现以及 ADFS 场景下“Cookie 过大导致 nginx 透传失败”这一典型问题的两种解决方案。一、ADFS 集成机制oauth2-proxy 如何对接 ADFSoauth2-proxy 内置了十余种身份提供商ADFS 是其中之一。从 pkg/apis/options/providers.go 的源码可以看到提供商类型通过ProviderType常量注册其中ADFSProvider ProviderType adfsL150-L152——这就是命令行参数--provideradfs的取值来源。在提供商实例化时providers/providers.go 的NewProvider函数会按类型分发L41-L42case options.ADFSProvider: return NewADFSProvider(providerData, providerConfig), nil值得注意的是providerRequiresOIDCProviderVerifierL190-L201将 ADFS 归类为必须启用 OIDC ID Token 校验的提供商类型。这说明 oauth2-proxy 对接 ADFS 走的是OIDCOpenID Connect协议路径oauth2-proxy 会拉取 ADFS 的 OIDC 元数据并校验 id_token 签名因此要求 ADFS 服务端开启 OIDC 协议端点。从源码结构看ADFSProvider 直接内嵌*OIDCProviderproviders/adfs.go L14-L22在标准 OIDC 流程之上仅叠加了少量 ADFS 特化逻辑。二、在 ADFS 管理控制台中创建应用原文档 4 步操作按照官方文档的指引在 ADFS 侧的准备工作共 4 步在 Windows Server 上打开 ADFS 管理控制台添加一个新的Application Group应用组为集成命名在Standalone applications独立应用区域选择Server Application服务器应用点击 Next按照向导完成配置获取client-id与client-secret并配置应用凭据使用第 3 步得到的凭据配置 oauth2-proxy见下一节。这三步完成后ADFS 侧即具备一个可供 oauth2-proxy 作为 OAuth2/OIDC 客户端使用的服务器应用oauth2-proxy 后续的所有登录交互都会以该 client-id 的身份发起。三、配置 oauth2-proxy 代理参数文档给出的最小启动参数如下--provideradfs --client-idapplication ID from step 3 --client-secretvalue from step 3各参数说明参数取值说明--provideradfs选择 ADFS 提供商类型对应源码常量options.ADFSProvider--client-idADFS 向导中生成的 Application IDOAuth2 客户端标识同时也是 id_token 的aud受众校验依据--client-secretADFS 向导中生成的 Secret客户端密钥用于换取 token 等流程除上述三个参数外接入 ADFS 时还需要配套 OIDC 通用参数如--provider-oidc-issuer-url等以及会话所需的--cookie-secret完整的 OIDC 通用选项说明可参考同版本的 OIDC 提供商文档 与 总览文档。从源码结构看ADFS 还有专属的 alpha 配置项。pkg/apis/options/providers.go 中定义了ADFSOptionsL232-L236type ADFSOptions struct { // Skip adding the scope parameter in login request // Default value is false SkipScope *bool yaml:skipScope,omitempty }该字段通过ADFSConfig ADFSOptions \yaml:ADFSConfig,omitemptyL81-L82挂在Provider配置下默认值由EnsureDefaults填充为falseDefaultADFSSkipScopeL32-L34 与 L418-L423。在 alpha YAML 配置中其对应结构形如provider: type: adfs clientID: application ID adfsConfig: skipScope: true # 登录 URL 中不携带 scope 参数默认 falseskipScope的作用在 providers/adfs.go 的GetLoginURL中体现L67-L71当开关打开时登录 URL 的 query 中会删除scope参数。对于按 Protected Resource 语义配置 ADFS 的部署scope 本身就是资源 URI这一选项可以避免重复或冲突的 scope 声明。四、源码深潜ADFSProvider 的三处 ADFS 特化逻辑ADFSProvider 相对通用 OIDCProvider 的差异化实现集中在 providers/adfs.go共三处理解它们有助于排查登录异常1. state 参数双重编码L60-L73// GetLoginURL Override to double encode the state parameter. If not query params are lost func (p *ADFSProvider) GetLoginURL(redirectURI, state, nonce string, extraParams url.Values) string { ... loginURL : makeLoginURL(p.Data(), redirectURI, url.QueryEscape(state), extraParams) ... }注释明确指出如果不对state二次 URL 编码ADFS 会丢失查询参数。这是针对 ADFS 实现行为做的兼容处理也解释了为何 ADFS 不能直接复用 OIDC 提供商默认的登录 URL 构造逻辑。2. 默认 scope 与 Protected Resource 前缀L26-L48NewADFSProvider将默认 scope 设为openid email profile常量adfsDefaultScopeL26-L30若配置了ProtectedResource则自动在 scope 前拼接资源 URI末尾补/形成 ADFS 特有的resource scope组合形式。3.upn声明的邮箱回退L75-L112ADFS 签发的 id_token 中 email 声明可能缺失受 ADFS 隐私配置影响。EnrichSession会先走 OIDC 的 ProfileURL 补全L77-L84一旦s.Email仍为空fallbackUPN会从 id_token/access_token 的upn声明取值填充s.EmailL97-L112RefreshSession在会话刷新路径上做了同样的回退L88-L95。这保证了即使用户令牌里没有标准 email 声明下游基于X-Forwarded-Email的授权逻辑依然可用。以上行为均有对应测试覆盖例如 providers/adfs_test.go 中验证了默认 scopeL135-L147与skipScope开启后登录 URL 不再包含 scope 参数L169-L200。五、实战排障ADFS nginx 下 Cookie 过大的问题原文档在末尾给出了一个重要的实操注意事项使用 ADFS 提供商配合 nginx 与 cookie 会话存储时Cookie 可能过大而无法被正确透传。增大 nginx 的proxy_buffer_size或改用 redis 会话存储均可解决。其原理在于ADFS 的 JWTid_token 等通常较大而默认会话后端将完整会话数据加密后塞入客户端 Cookie随每个请求往返传输。nginx 默认的proxy_buffer_size如 4k/8k不足以缓冲如此大的请求头导致透传失败或请求异常。两种解决路径调大 nginx 缓冲在 nginx 配置中增大proxy_buffer_size仓库在 contrib/local-environment/nginx.conf 提供了本地联调用的 nginx 配置可作为调参起点改用 redis 会话存储按 Session Storage 文档 的 Redis Storage 小节配置--session-store-typeredis与--redis-connection-url。Redis 方案下浏览器只保存一个短 ticket格式为{CookieName}-{ticketID}.{secret}其中 ticketID 为 128 位随机数加密后的完整会话含 ADFS 的大体积 JWT存放在 Redis 中从根本上消除了 Cookie 体积问题同时还能避免 cookie 后端并发刷新冲突导致的强制重新登录。文档同时建议根据访问令牌/刷新令牌寿命合理设置--cookie-refresh与--cookie-expire如cookie_refresh : Access-Token lifespan - 1m以保证刷新流程可靠。六、小结与参考ADFS 接入本质上是“OIDC 提供商 ADFS 特化修补”state 双重编码、upn邮箱回退、scope 前缀处理都围绕 ADFS 的实际行为定制见 providers/adfs.go最小接入参数为--provideradfs、--client-id、--client-secret可选 alpha 项adfsConfig.skipScope生产环境建议评估 redis 会话存储规避 ADFS 大 Cookie 与 nginx 缓冲的冲突。主要参考路径ADFS 文档7.11.x、providers/adfs.go、providers/adfs_test.go、providers/providers.go、pkg/apis/options/providers.go、Session Storage 文档。适用前提本文以仓库当前主干源码与 7.11.x 版本文档为准ADFS 服务端需已启用 OIDC 协议端点具体 ADFS 版本差异请以 Microsoft 官方文档为准。【免费下载链接】oauth2-proxyA reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.项目地址: https://gitcode.com/GitHub_Trending/oa/oauth2-proxy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表