OpenID和SAML有什么区别?

181

OpenID和SAML有什么区别?

4个回答

194

原始OpenID 2.0与SAML

它们是两种不同的认证协议,在技术层面上存在差异。

从远处看,差异始于用户启动认证时。使用OpenID,用户登录通常是负责认证的资源的HTTP地址。另一方面,SAML基于您的站点和身份提供者之间的明确信任,因此接受来自未知站点的凭据相对不常见。

OpenID身份易于在网络上获取。作为开发人员,您可以接受来自非常不同的OpenID提供程序的用户。另一方面,SAML提供程序通常必须事先编码,并且您只能将应用程序与选定的身份提供程序联合。可以缩小接受的OpenID身份提供程序列表,但我认为这将违背一般的OpenID概念。

使用OpenID,您可以接受来自任意服务器的身份。有人声称是http://someopenid.provider.com/john.smith。您如何将此与数据库中的用户匹配?例如通过使用新帐户存储此信息,并在用户再次访问您的站点时识别此信息。请注意,关于用户的任何其他信息(包括他的姓名或电子邮件)都不能信任!

另一方面,如果您的应用程序与SAML Id提供程序之间存在明确的信任关系,则可以获得有关用户的完整信息,包括姓名和电子邮件,并且可以信任此信息,仅仅因为存在信任关系。这意味着您倾向于相信Id提供程序已经验证了所有信息,您可以在应用程序级别上信任它。如果用户带着由未知提供程序发出的SAML令牌到来,您的应用程序将拒绝认证。

OpenID Connect与SAML

(本段添加于2017年07月,更新于2018年08月)

这个回答是2011年的,当时OpenID代表OpenID 2.0。后来在2012年左右,OAuth2.0被发布,而在2014年,OpenID Connect也随之问世(更详细的时间线请参见此处)。

对于现在阅读此内容的任何人来说,OpenID Connect与原始答案提到的OpenID不同,它实际上是OAuth2.0的一组扩展。

虽然这个回答可以从概念角度提供一些启示,但对于那些具备OAuth2.0背景的人来说,OpenID Connect的非常简洁的版本是:在访问令牌可用之后,OpenID Connect实际上的OAuth2.0,但它添加了一种标准的方式查询用户信息

关于原始问题——OpenID Connect(OAuth2.0)和SAML之间的主要区别是应用程序和身份提供者之间建立信任关系的方式:

  • SAML基于数字签名建立信任关系,由身份提供者发布的SAML令牌是已签名的XML文件,应用程序验证签名本身以及它呈现的证书。用户信息包含在SAML令牌中,还有其他信息。

  • OAuth2基于应用程序直接向身份验证服务器发出HTTPs调用来建立信任关系。请求包含访问令牌(应用程序在协议流程中获取),响应包含有关用户的信息。

  • OpenID Connect进一步扩展了这一点,使得可以在不涉及应用程序对身份验证服务器的调用的情况下获得身份。这个想法基于OpenID Connect提供商实际上发行了两个令牌,即access_token(与OAuth2.0发行的完全相同)和新的id_token,这是一个JWT令牌,由身份验证服务器签名。应用程序可以使用id_token根据JWT令牌中包含的声明建立本地会话,但id_token不能用于进一步查询其他服务。这样的第三方服务调用仍应使用access_token。您可以将OpenID Connect视为SAML2(已签名令牌)和OAuth2(访问令牌)之间的混合体,因为OpenID Connect涉及了两者。


14
“信任”这一概念在SAML文化中非常重要,因为它来自联邦文化。在SAML联邦中,一个账户应该是一个与现有IdP保持当前关系的单个人之间的1:1关系,“断言”用户认证和授权。在联邦中操作IdP的实体必须遵守账户货币性和验证周围的治理。举例来说,账户去配置和基于角色的账户可行性可能是特别不同的领域。此外,SAML越来越“企业化”,而OpenID更多地涉及网络领域。 - Cameron Kerr
仅用三个小段落,您解释了一些文件页无法清楚表达的内容。+1 - user3437460

93

OpenID 和 SAML2 都基于联合身份的概念。以下是它们之间的一些区别。

  1. SAML2 支持单点注销,而 OpenID 不支持。
  2. SAML2 服务提供商与 SAML2 身份提供商耦合,但 OpenID 依赖方与 OpenID 提供商不耦合。OpenID 有一个发现协议,可以动态发现相应的 OpenID 提供商,一旦给出了 OpenID。SAML 有一个基于 Identity Provider Discovery Service Protocol 的发现协议。
  3. 使用 SAML2,用户与 SAML2 IdP 相关联 - 您的 SAML2 标识符仅对发出它的 SAML2 IdP 有效。但是,在 OpenID 中,您拥有自己的标识符,并且可以将其映射到任何您想要的 OpenID 提供商。
  4. SAML2 有不同的绑定方式,而 OpenID 只有 HTTP 绑定。
  5. SAML2 可以是服务提供商(SP)启动或身份提供者(IdP)启动。但是 OpenID 总是 SP 启动。
  6. SAML 2 基于 XML,而 OpenID 不是基于 XML。
  7. 过去 3 年中开发的大多数应用程序只支持 OpenID Connect。
  8. 2018 年 5 月,Microsoft Azure AD 处理的 80 亿多个身份验证请求中有 92% 是来自支持 OpenID Connect 的应用程序。

1
  1. 不一定:SP 只能信任特定 IP 的身份。但同意,支持任何 IP 是 OpenID 的默认和推荐方式。
- Oliv
如果你使用了开源的 SAML 库,比如来自 Okta 或 OneLogin 的库,那么你是否能够将该库同时用于多个身份提供者,或者你需要为每个身份提供者使用不同的库呢? - Blankman

25

撇开技术细节,我理解SAML和其他身份验证标准(包括OpenID)最大的区别在于:

SAML 要求身份提供者(IDP)和服务提供者(SP)预先知道对方,进行预配置静态认证和授权。而 OpenID(+Connect)并没有此要求。

这对于希望全面掌控谁能访问数据的IDP很重要。标准的一部分是配置特定的SP提供什么信息。

例如,银行可能不希望其用户访问除了一些预定义服务之外的任何服务(因为法规或其他严格的安全规则)。

这并不意味着OpenId IDP不能执行这样的限制。OpenID的实现者可以控制访问,但这不是OpenID的目的。

除了预定义的、严格的、静态的访问控制差异之外,在概念上(而不是技术上),OpenID ConnectSAML 是类似的。

总之,如果你是一个SP,你应该支持你的客户需要:

  1. 如果你的客户是个人终端用户(例如使用他们的Google ID),那么忘记SAML吧。使用OpenID Connect。
  2. 如果你的客户是一家银行,希望其员工使用你的服务并只导出静态数据列表,那么银行可能希望你支持SAML。银行可能有一个带有客户端限制的OpenID实现,这将是你的幸运日 :)

2
这是最简单的表述方式。好的例子,感谢解释! - BBK

17

SAML和OpenID都可以作为身份提供者(IdP)即分散式认证协议(单点登录身份验证)。

Security Assertion Markup Language(SAML)是一组用于在安全域之间交换身份验证和授权数据的配置文件。在SAML领域模型中,身份提供者是一种特殊类型的身份验证机构。具体而言,SAML身份提供者是发出身份验证声明的系统实体,与SAML的SSO配置文件一起使用。消费这些身份验证声明的受信方称为SAML服务提供商。来源

OpenID Connect(OIDC)是建立在OAuth 2.0授权框架之上的认证层。该标准由OpenID Foundation控制。OAuth是授权协议,而不是身份验证协议,而OpenID专门设计为身份验证协议。 OIDC使用简单的JSON Web令牌(JWT),它们易于通过JavaScript消费。

SAML 2.0 OAusth2 OpenID Connect
它是什么?授权和身份认证的开放标准 授权的开放标准 身份认证的开放标准
历史 由OASIS于2001年开发 由Twitter和Google在2006年部署 由OpenID基金会于2014年部署
主要用途 企业应用的SSO API授权 消费者应用的SSO
格式 XML JSON JSON

来源


1
这是一个令人困惑的答案。您在文本中正确描述了“OpenID Connect”,但省略了OpenID。OpenID Connect并不是OpenID。 - Tomm P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接