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

相关文章

解读Pandas和Polars的区别及说明

《解读Pandas和Polars的区别及说明》Pandas和Polars是Python中用于数据处理的两个库,Pandas适用于中小规模数据的快速原型开发和复杂数据操作,而Polars则专注于高效数据... 目录Pandas vs Polars 对比表使用场景对比Pandas 的使用场景Polars 的使用

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`