SAML与OAuth联合登录的比较

103

SAML和OAuth联合登录有什么区别?如果公司想要使用第三方Web应用程序,同时希望进行单点登录并成为认证机构,那么哪种解决方案更合理呢?


值得注意的是,可以通过将用户的配置文件存储在cookie中来实现SSO。在这种情况下,当用户被重定向到ID提供程序时,发送的cookie用于确认身份,因此不需要登录提示。以下是OAuth的图表 - https://alex-klaus.com/transparent-auth-gateway-2/ - Alex Klaus
7个回答

128

它们解决不同的问题。

SAML 是一组标准,用于共享有关用户身份、属性集的信息,并为您提供授予/拒绝访问某些内容或甚至请求身份验证的方法。

OAuth 更多地涉及委派对某些内容的访问。基本上,您允许某人“代表”您行事。它最常用于授予访问可以代表您执行某些操作的API。

它们是两个完全不同的东西。


以下是一些可能有用的示例。

OAuth类似于Twitter。假设您正在使用Google Buzz和Twitter,并且您想编写一个应用程序以使两者同步。您可以在您的应用程序和Twitter之间建立信任关系。第一次链接应用程序到Twitter时,您需要经典提示登录Twitter,然后确认框弹出并询问“是否授予«您的应用程序名称»访问权限?”一旦您单击“是”,信任就已经建立,现在您的应用程序可以代表您在Twitter上行动。它可以读取您的帖子,并创建新的帖子。

SAML - SAML是两个不相关成员系统之间的某种“协议”。在我们的情况下,我们可以使用美国航空公司和赫兹。没有共享的凭据可以将您从一个站点带到另一个站点,但假设Hertz想向美国航空公司提供“优惠”。(虽然我知道这是一个极端的例子,但请耐心等待)。购买机票后,他们将向其主席会员提供一辆免费租车。美国航空公司和赫兹将建立某种形式的信任,并找到一种识别用户的方式。在我们的情况下,“联合身份”将是电子邮件地址,并且它将是一种单向信任,即赫兹相信美国航空公司的身份验证提供程序将以准确和安全的方式提供令牌。在预订航班后,美国航空公司的身份验证提供程序将生成一个令牌并填充有关用户已通过身份验证的信息,以及有关此人的“属性”,在我们的情况下,最重要的属性将是他在美国航空公司的状态级别。填充令牌后,它通过某种引用或编码在URL中传递,一旦到达赫兹,它就会查看令牌,验证它,现在可以允许免费租车。

这个SAML示例的问题在于它只是许多专业用例中的一个。 SAML是一种标准,有太多实现方式。


或者,如果您不关心授权,您几乎可以认为通过SAML和OpenID进行身份验证。


4
我还是没有理解它们的区别。“授予/拒绝访问”和“授予访问API”的听起来对我来说是一样的。你能给出两个更相似的例子,这样我就能看到区别了吗? 例如,为什么我们不能使用SAML在您的应用程序和Twitter之间建立信任呢?或者为什么您不能使用OAuth告诉Hertz关于美国航空的特别交易? - Tim Cooper
3
我有点理解了,但我可以通过请求访问提供身份验证的API来使用OAuth进行单点登录(SSO)。这是否意味着OAuth可以做到SAML所能做的一切,并且还可以更多? - Dirk
@Dirk,你说得几乎正确,即我们可以使用OAuth获取用户的身份,就像许多应用程序要求通过Google、Facebook、GitHub登录以获取用户的身份和其他属性,让他们进入应用程序一样。但是,确实可以通过OAuth实现更多功能,而不仅仅是获取身份。 - chirag soni

43

请看这个简单解释,详见此处:

许多人对SAML、OpenID和OAuth之间的区别感到困惑,但实际上很简单。虽然有些重叠,以下是一个非常简单的区分方式。

OpenID - 面向消费者的单点登录

SAML - 面向企业用户的单点登录

OAuth - 应用程序之间的API授权

对于熟悉OO设计模式的人来说,我认为有一个很好的类比是"包装器模式"。想象一下"Facade"(外观)、"Decorator"(装饰器)和"Proxy"(代理)模式。从根本上讲,它们都是相同的,只是包装器不同...差异在于每个模式的意图

同样,SAML、OAuth和OpenID通过一个共同的基础机制实现了不同的意图,即重定向到服务提供商/身份验证机构以进行某些私有交互,然后将其重定向回第三方应用程序。

在网上搜索时,您会发现协议之间存在重叠的能力。通过OAuth进行身份验证是完全合理的。尽管SSO(单点登录)使用OAuth可能没有太多意义,因为SAML和OpenID专门面向联合标识

针对这个问题,在企业环境中,对于SSO而言,SAML比OAuth更加合适。我打赌,如果您看一下您想要集成到企业身份的第三方应用程序,您会发现它们已经被设计为与SAML/LDAP/Radius等集成。在我看来,OAuth更适用于应用程序之间的Internet交互或大型企业环境中构成服务定向体系结构的应用程序。

在企业环境中,授权规则也可以通过其他方式来指定,LDAP是一种常用的工具。将用户组织成组,并将应用程序权限与组成员身份相关联是一种广泛采用的方法。恰好LDAP也可用于身份验证。Active Directory是一个很好的例子,尽管我更喜欢OpenLDAP。


1
感谢 @Sundeep 更新链接。 - quickshiftin
链接已更新,但是答案中已经有的摘要内容没有变化。 - quickshiftin
OpenID仅基于oAuth构建。oAuth本身不支持用户界面,而OpenID为我们提供了这个功能。除此之外,oAuth和OpenID之间没有其他区别。 - It's a trap
@It'satrap 不是真的;OpenID 是关于身份验证,OAuth 是关于授权,但它们共享类似的(浏览器重定向)机制。两者都与 UI 没有太多关系... 也可以参考 这个答案。你还可以看看这里。你也可以重新阅读我的回答以获得更多澄清哈哈。 - quickshiftin
1
@It'satrap 你可能想看一下OpenId规范,它是基于OAuth 2.0构建的“身份验证”;还有OAuth 2.0规范,“OAuth 2.0 授权框架”...再次强调,一个是为身份验证设计的,另一个是为授权设计的。利用后者来实现前者是可以的,因为它们共享一个共同的基础范例(我已经说了第三或第四遍了,哈哈)。所有内容都在我的回答中总结了。你应该学会如何阅读,兄弟。 - quickshiftin
显示剩余2条评论

4

在这里发现了一篇好的文章

enter image description here

SAML(安全断言标记语言)是一组用于实现单点登录(SSO)、联合和身份管理的标准。

例如:用户(主体)在航班预订网站AirFlyer(身份提供者)进行认证,该网站通过SAML与穿梭预订网站Shuttler(服务提供者)配置了SSO。一旦经过Flyer的认证后,用户可以在Shuttler上预订穿梭车而无需重新认证。

OAuth(开放授权)是一个用于资源授权的标准,它不涉及认证。

例如:照片共享移动应用程序(OAuth消费者)允许用户从其Instagram账户(OAuth提供商)导入照片,该提供商向照片共享应用程序发送临时访问令牌或密钥,该令牌在几个小时后过期。


提供的链接无法访问。请提供有效的链接。 - xeon zolt

3

他们处理一个微妙的用例

  • SAML - 将用户的凭据(例如SSO)共享给各种服务提供商(例如Web或Web服务)
  • OAuth - 用户代表自己授权应用程序访问资源

请将以下与编程相关的内容从英文翻译为中文。仅返回简洁和简单的翻译文本: - Dexter

2
SAML有各种“配置文件”可供选择,允许其他用户“登录”到您的网站。 SAML-P或SAML被动是非常常见且相当简单设置的。 WS-Trust类似,它也允许网站之间进行联合。
OAuth旨在进行授权。 您可以在此处阅读更多信息:OpenID和OAuth之间有什么区别?

我很难理解“登录”和“授权”的区别。你能举个例子说明一下吗? - Tim Cooper
@TimCooper,“登录”是指“认证”的宽泛术语,而“授权”则是指授权的良好术语...根据您的要求提供一个示例 - quickshiftin
1
@quickshiftin 好的,我理解了这个区别。你的回答似乎暗示SAML负责认证而OAuth负责授权,这是正确的吗?还是它们都能认证和授权 - 如果是这样,那么我仍然不知道它们之间的区别。 - Tim Cooper
1
协议具有一些重叠的功能。OAuth针对授权,但它也支持身份验证。在企业环境中,SSO是SAML专门为之构建的。反过来,SAML也支持授权。上下文是决定使用哪种技术的最重要因素。去年,我编写了一个Expression Engine扩展程序,它使用SimpleSAMLPhp对Kerberos后端进行用户身份验证,然后从LDAP系统查找授权规则。这是一个疯狂的世界! - quickshiftin

1

https://dev59.com/VV4d5IYBdhLWcg3wAOZw - LCJ

0

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