我有一项服务允许通过 SAML2 进行 SSO。当使用 SAML2 时,我们将整个身份验证过程委托给身份提供者。
我们正在考虑添加 OAuth 以支持某些移动应用程序。(我们不希望用户必须不断登录。)
当我们使用自己的用户名/密码身份验证时,很明显它们将如何协同工作,因为我们控制着整个堆栈。
OAuth 将如何与 SAML2 SSO 交互?例如,如果身份提供者删除了用户,应该怎么做才能使 OAuth 授权无效?还有哪些其他陷阱(希望是标准解决方案)?
我有一项服务允许通过 SAML2 进行 SSO。当使用 SAML2 时,我们将整个身份验证过程委托给身份提供者。
我们正在考虑添加 OAuth 以支持某些移动应用程序。(我们不希望用户必须不断登录。)
当我们使用自己的用户名/密码身份验证时,很明显它们将如何协同工作,因为我们控制着整个堆栈。
OAuth 将如何与 SAML2 SSO 交互?例如,如果身份提供者删除了用户,应该怎么做才能使 OAuth 授权无效?还有哪些其他陷阱(希望是标准解决方案)?
桥接 SAML 和 OAuth 2.0 框架是一个很好理解的问题。以下 IETF 规范堆栈提供了标准解决方案:
如果您查看核心OAuth 2.0 规范(RFC 6749) 及其令牌端点定义——这基本上是一个 OAuth 服务器端点,它返回一个访问令牌以换取“授权”——一个被认为适合的开放式概念授予客户端应用程序访问令牌的问题。在典型的 OAuth 场景中,这是一个授权代码,表示用户之前已经过身份验证并获得了他们的同意。但赠款也可能是别的东西。
还有一个名为draft-ietf-oauth-assertions-16 的IETF 规范,它建立在核心 RFC 6749 标准之上,该标准说授权也可以是一个断言(某事的签名证明),并为此定义了必要的令牌请求参数.
最后,还有draft-ietf-oauth-saml2-bearer-20,它指定此断言如何成为 SAML 2.0 Bearer Assertion。
这种将 SAML 断言转换为 OAuth 2.0 访问令牌的标准机制基本上就是桥接这两个框架所需的全部内容。
为确保授权系统正确反映用户的删除,有两种方法可以组合使用:
我所知道的这种组合的唯一实现是 Salesforce。您要做的是一个复杂的设置 - 两种协议都不简单,并且它们的交互存在问题,例如您提到的那个。
看看这个文档(SF 实现从外部看起来是什么样的) - https://wiki.developerforce.com/page/Single_Sign-On_for_Desktop_and_Mobile_Applications_using_SAML_and_OAuth
并检查此草稿(我个人没有仔细研究过它,但它专门针对您的情况https://datatracker.ietf.org/doc/html/draft-ietf-oauth-saml2-bearer-16