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

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

深入探讨:ECMAScript与JavaScript的区别

在前端开发的世界中,JavaScript无疑是最受欢迎的编程语言之一。然而,很多开发者在使用JavaScript时,可能并不清楚ECMAScript与JavaScript之间的关系和区别。本文将深入探讨这两者的不同之处,并通过案例帮助大家更好地理解。 一、什么是ECMAScript? ECMAScript(简称ES)是一种脚本语言的标准,由ECMA国际组织制定。它定义了语言的语法、类型、语句、