oauth - 将 OIDC IDP 插入现有的 SP SAML 连接
问题描述
目前我有一个依赖于 SAML 身份提供者的 SP。它还支持用户直接登录到 SP。用户可以直接登录,也可以从 SP 开始并重定向到 SAML 身份提供者进行身份验证。
我计划将 SP 转换为使用 OIDC 和 IdSrv4,并且根本没有 SP 托管凭据。我仍然希望支持 SAML 提供程序,但最好通过新的 OIDC IdP。将这个新的 OIDC IdP 添加到 SAML 流中的正确方法是什么?我是否:
- 让 SP 和 SAML 进行通信,然后将 SAML 响应传递给 IdP 进行翻译(这似乎不正确并且容易被滥用)
- 让 SP 重定向到具有某些上下文的 OIDC IdP,以了解转到 SAML。然后 OIDC IdP 处理 SAML 响应并通过常规 OIDC 流到 SP。
- 告诉 IdP 在某些情况下使用(重定向到)某个 SAML IdP 并在其他情况下提示输入 OIDC IdP 凭据的最佳做法是什么?
- 让 SP 使用 SAML IdP 并让它使用 OIDC IdP?
- 还有什么?
解决方案
问题一:
让 SP 和 SAML 进行通信,然后将 SAML 响应传递给 IdP 进行翻译(这似乎不正确并且容易被滥用)
答案:
OIDC 和 SAML 是两种不同的身份联合协议,允许第三方身份提供者为依赖方 Web 应用程序提供身份验证服务。
SAML SP 只能向 SAML IdP(身份提供者)发送 SAML 身份验证请求,因为 OIDC IdP 无法解码 SAML 身份验证请求。
问题 2:让 SP 重定向到 OIDC IdP,并知道要转到 SAML 的一些上下文。然后 OIDC IdP 处理 SAML 响应并通过常规 OIDC 流到 SP。
What is best practice to tell IdP to use (redirect to) a certain SAML IdP in certain contexts and prompting for OIDC IdP creds in other contexts?
答案:
OIDC IdP 无法解码 SAML 身份验证请求,因为 OIDC 和 SAML 是两种不同的协议。
问题 3:让 SP 使用 SAML IdP 并让它使用 OIDC IdP?
答案:
是的。您可以使用 SAML IdP 保留 SP,也可以部署 OIDC RP(依赖方)以使用 OIDC IdP。
(1) 身份提供者可以配备OIDC IdP(身份提供者)和SAML IdP,以同时支持OIDC和SAML协议。
例如,我们开发了零密码认证和授权系统作为身份提供者,以支持 SAML、OIDC、OAuth 和 WS-Fed,即零密码认证和授权系统可以为任何 Web 应用程序提供身份认证/联合配备 SAML SP、OIDC RP、OAuth RP 或 WS-Fed RP。
(2) 依赖方 Web 应用程序可以配备OIDC RP(依赖方)和SAML SP(服务提供者),以同时支持 OIDC 和 SAML 协议。
例如,作为一个依赖方 Web 应用程序,Openstack 可以配置为 SAML SP 或 OIDC RP 以分别与 SAML IdP 或 OIDC IdP 通信。
官方 Openstack 链接为联合配置 Keystone提供了有关如何将 Openstack 配置为 SAML SP 或 OIDC RP 的说明。
问题 4:
还有什么?
分辨率:
您的 Web 应用程序登录页面可以分别提供OIDC 登录和SAML 登录两个按钮。
(1) 单击OIDC 登录按钮将用户重定向到您的身份提供者的OIDC API。
您的身份提供者的 OIDC API 将要求用户提交他们的身份验证凭证,例如用户名/密码。
用户通过身份验证后,用户将被重定向回Web 应用程序的OIDC API 。
最后,用户将登录到您的 Web 应用程序。
(2) 单击SAML 登录按钮将用户重定向到您的身份提供者的SAML API。
您的身份提供者的 SAML API 将要求用户提交他们的身份验证凭证,例如用户名/密码。
用户通过身份验证后,用户将被重定向回您的 Web 应用程序的SAML API。
最后,用户将登录到您的 Web 应用程序。
后续问题:
我想要做的是让 OIDC IdP 成为 SAML 提供商的 SP,这样我的所有 OIDC RP 都不必是 SAML SP。有没有通用的处理方法?
我试图不让我的客户端应用程序 (RP) 依赖 SAML。但是,如果 IdP 可以根据该身份验证响应发出 SAML 请求,那么 OIDC 似乎可以提供 OIDC 身份验证响应。
答案:
(1)实现OIDC IdP的SAML SP特性(即,使OIDC IdP作为SAML IdP的SAML SP)是一种成本昂贵的解决方案。
(I) OIDC IdP 向 SAML IdP 发送 SAML auth 请求
(II) OIDC IdP 解码来自 SAML IdP 的 SAML 响应
(III) OIDC IdP 将 SAML 断言转换为 OIDC 令牌(即将 SAML 响应转换为 OIDC 响应可以被 OIDC RP 解码)
用于 OAuth 2.0 客户端身份验证和授权授权的 RFC 7521 断言框架和用于 OAuth 2.0 客户端身份验证和授权授权的RFC 7522 安全断言标记语言 (SAML) 2.0 配置文件支持具有授权授权流程的 SAML 2 承载配置文件。
Microfocus 提供了关于Exchange SAML 2 Assertion with OAuth Access Token的说明。
WSO2 还提供了使用 OAuth2-SAML Extension Grant Type 交换 SAML2 Bearer Tokens的说明。
(2) 具有成本效益的解决方案是
(I) Web 服务器同时托管 OIDC IdP 和 SAML IdP,然后利用 HAProxy 配置 OIDC IdP 和 SAML IdP 以使用子域,例如 oidcidp.your-domain.com 和 samlidp.yourdomain.com
OIDC IdP 和 SAML IdP 可以使用相同的数据存储或数据存储库(例如 OpenLDAP)来验证用户名/密码凭证。
(II) OIDC RP与OIDC IdP通信,SAML SP与SAML IdP通信。
(3) 问题 4 的决议描述了另一种具有成本效益的解决方案。
您的身份提供者实现了OIDC IdP API和 **SAML IdP API" 以分别与 OIDC RP 和 SAML SP 通信。
推荐阅读
- android - 矢量绘图在某些设备上未正确显示
- python - Traceback(最近一次调用最后一次):ValueError:对已关闭文件的 I/O 操作
- javascript - YouTube 数据 API Node.js quickstart.js 问题
- apache-flink - 我们可以调用 SourceFunction#collectWithTimestamp 摄取时间中指定的时间戳吗
- apache-spark - 如何在结构化流中正确使用 foreachBatch.batchDF.unpersist()?(继续出错)
- php - Jquery Datepicker - 如何从另一个函数中的选择选项中获取日期数组,并将其传递给 datepicker 中的 disabledate
- javascript - 如何从 decodeURI(encodeURIComponent(originalString)) 中恢复?
- java - Java中获取所有IP子网详细信息的方法
- javascript - 如何通过 React Navigation 将导航道具传入功能组件屏幕?
- php - Eloquent 模型上的 $touches 属性确实减慢了测试速度