本文主要是介绍单点登录:SAML、OAuth2、OIDC 的区别与联系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 概要
- 单点登录架构流程
- SAML
- OAuth2
- OIDC
- 小结
概要
首先,我们概况一下什么是单点登录:
单点登录(SSO)是一种集中式访问控制技术,允许主体在系统上进行单次身份认证并访问多个资源,而不必再次进行身份认证。
登录一定会涉及的两个概念:
- 认证:验证主体身份的有效性,其中主体不仅单指用户,也会涉及对设备、服务的验证。
- 授权:授予主体对客体的权限信息,主体是活动的,客体是被动的,两者的关系处于流动的状态,取决于不同的业务场景。
单点登录的优势在于用户友好,方便,以及安全性高,用户不需要记住多个用户名和口令(用户往往会将其记录到纸上或文档中,造成泄露)。
单点登录的主要缺点是,攻击者一旦侵入账号,即可对所有授权资源的应用程序无限制访问。
单点登录架构流程
- Client(用户)在浏览器页面上请求Application Server(应用服务)
- Service Loader 发现未登录,重定向到 Authentication Server(认证服务),并携带当前Application Server的重定向地址、应用标识等信息
- Client 浏览器的页面重定向到 Authentication Server
- Authentication Server发现未登录,显示登录页面
- Client 输入认证信息
- Authentication Server对认证信息校验,如果认证成功则生成对应的cookie信息返回至浏览器,
- Authentication Server同时重定向到步骤2中携带的Application Server重定向地址,并携带一个ticket信息。
- Application Server会用ticket再次请求Authentication Server,如果校验通过,则获取到合法的用户信息。
- Application Server生成当前服务的cookie信息返回至浏览器,并提供服务。
- 后续Client请求其他Application Server,会跳过步骤4、5,6,从而实现单点登录的效果。
所以,我们可以看出单点登录最重要的因素在于Authentication Server(认证服务)的全局会话。同时为了安全性,Authentication Server也会对认证的应用进行安全校验、对ticket进行时间和使用次数的校验。进一步的,同一个Client在不同Application Server可能也有不同的权限,这时候Authentication Server就需要包含Authorization Server(授权服务)功能。
SAML
SAML协议全称为Security Assertion Markup Language,它是一个基于XML的标准协议。SAML标准定义了身份提供者(Identity Provider)和服务提供者(Service Provider)之间,如何通过SAML规范,采用加密和签名的方式来建立互信,从而交换用户身份信息。
其中,Service Provider可以理解上面单点登录流程中的Application Server,Identity Provider则为Authentication Server。
SAML与上面单点登录流程可能不同的地方有:
- Identity Provider认证用户信息通过后,会通过加密和签名的方式将用户信息直接返回Service Provider。这也要求两者之间要互换证书来建立互信。
- SAML协议特别复杂、在使用中一些细节会给使用者带来困扰。
- SAML协议传递的数据是加密后的XML数据。
OAuth2
OAuth2其实是一个Authorization Server(授权服务),当然也包含了基础的Authentication Server(认证服务)。它是为了解决同一个用户在不同Application Server之间的权限请求控制问题。
在OAuth 2.0的协议交互中,有四个角色的定义:
- 资源所有者(Resource Owner):拥有资源的所有权,可以解决应用程序(Client)能否访问资源服务器(Resource Server)。
- 资源服务器(Resource Server):保存着受保护的用户资源。
- 应用程序(Client):需要访问用户资源的应用程序。
- 授权服务器(Authorization Server):授权服务器,在获取用户的同意授权后,颁发访问令牌给应用程序,以便其获取用户资源。
举个例子,我登录CSDN的时候,有个选项是是否使用微信登录,如果使用微信登录,就会从微信服务获取用户信息并登录。这时候,资源所有者就是我,资源服务器是微信,授权服务器也是微信,应用程序就是CSDN。
OAuth 2.0定义了四种授权方式。
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
这里以授权码模式为例:
- 如果我选了使用微信登录,那么CSDN就会如单点登录流程步骤2中所示,跳转到微信页面,同时携带CSDN的重定向地址、应用标识等信息;
- 作为资源所有者的我选择是否给予CSDN授权;
- 如果选择授权,微信就会如单点登录流程步骤7一样,重定向到CSDN页面,同时携带一个authorization code(作用和ticket一样)和重定向URI;
- CSDN收到授权码,在请求中携带授权码和重定向URI向微信申请令牌;
- 微信核对了授权码和重定向URI,确认无误后,向CSDN送访问令牌(access token)和更新令牌(refresh token)。
OIDC
OIDC是OAuth2.0的超集,可以理解为OIDC=身份认证+OAuth2.0。
OIDC中的一些关键角色:
- EU, End User的缩写,指的是一个最终用户,可以理解为OAuth2中的资源所有者。
- RP, Relying Party的缩写,指的是身份认证和授权信息的消费方,可以理解为OAuth2中的Client。
- OP, OpenID Provider的缩写,指的是有能力提供EU认证的服务,可以理解为OAuth2中的授权服务,用来为RP提供EU的身份认证信息。
OIDC的核心在于授权过程中,一并提供用户的身份认证信息ID-Token(使用JWT来包装)给到第三方客户端,OP通常还提供了GetUserInfo的接口,用于获取用户更完整的信息。
这样不同的RP就可以基于ID Token来认证是不是同一个用户。
小结
SAML、OAuth2、OIDC的联系:
- 所有这三个协议都是为了解决身份认证和授权的问题。
- 它们都需要一个中央的身份提供者,这个提供者负责验证用户的身份,并将身份信息提供给需要的应用。
- 它们都使用了一种或多种方式来保护用户的数据,包括加密和签名。
SAML、OAuth2、OIDC的区别:
- SAML主要用于单点登录,而OAuth2和OIDC主要用于授权和身份认证。
- OAuth2更注重于授权,而OIDC在OAuth2的基础上增加了身份认证的功能。
- SAML和OIDC都会直接返回用户的身份信息,而OAuth2只返回了一个可以获取用户信息的令牌。
这篇关于单点登录:SAML、OAuth2、OIDC 的区别与联系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!