单点登录: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

相关文章

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

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Spring中@RestController和@Controller的使用及区别

《Spring中@RestController和@Controller的使用及区别》:本文主要介绍Spring中@RestController和@Controller的使用及区别,具有很好的参考价... 目录Spring中@RestController和@Controller使用及区别1. 基本定义2. 使

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言