单点登录:SAML、OAuth2、OIDC 的区别与联系

2024-04-25 13:44

本文主要是介绍单点登录:SAML、OAuth2、OIDC 的区别与联系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 概要
    • 单点登录架构流程
    • SAML
    • OAuth2
    • OIDC
    • 小结

概要

首先,我们概况一下什么是单点登录:
单点登录(SSO)是一种集中式访问控制技术,允许主体在系统上进行单次身份认证并访问多个资源,而不必再次进行身份认证。

登录一定会涉及的两个概念:

  • 认证:验证主体身份的有效性,其中主体不仅单指用户,也会涉及对设备、服务的验证。
  • 授权:授予主体客体的权限信息,主体是活动的,客体是被动的,两者的关系处于流动的状态,取决于不同的业务场景。

单点登录的优势在于用户友好,方便,以及安全性高,用户不需要记住多个用户名和口令(用户往往会将其记录到纸上或文档中,造成泄露)。

单点登录的主要缺点是,攻击者一旦侵入账号,即可对所有授权资源的应用程序无限制访问。

单点登录架构流程

  1. Client(用户)在浏览器页面上请求Application Server(应用服务)
  2. Service Loader 发现未登录,重定向到 Authentication Server(认证服务),并携带当前Application Server的重定向地址、应用标识等信息
  3. Client 浏览器的页面重定向到 Authentication Server
  4. Authentication Server发现未登录,显示登录页面
  5. Client 输入认证信息
  6. Authentication Server对认证信息校验,如果认证成功则生成对应的cookie信息返回至浏览器,
  7. Authentication Server同时重定向到步骤2中携带的Application Server重定向地址,并携带一个ticket信息。
  8. Application Server会用ticket再次请求Authentication Server,如果校验通过,则获取到合法的用户信息。
  9. Application Server生成当前服务的cookie信息返回至浏览器,并提供服务。
  10. 后续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)

这里以授权码模式为例:

  1. 如果我选了使用微信登录,那么CSDN就会如单点登录流程步骤2中所示,跳转到微信页面,同时携带CSDN的重定向地址、应用标识等信息;
  2. 作为资源所有者的我选择是否给予CSDN授权;
  3. 如果选择授权,微信就会如单点登录流程步骤7一样,重定向到CSDN页面,同时携带一个authorization code(作用和ticket一样)和重定向URI;
  4. CSDN收到授权码,在请求中携带授权码和重定向URI向微信申请令牌;
  5. 微信核对了授权码和重定向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 的区别与联系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934841

相关文章

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab