相关文章推荐
玉树临风的汤圆  ·  防止 ASP.NET ...·  2 月前    · 
非常酷的红茶  ·  关于Copy On Write Array ...·  2 年前    · 

单点登录SSO

学习单点登录的前置条件是熟悉cookie和session

############

cookie (储存在用户本地终端上的数据) : cookie(储存在用户本地终端上的数据)_百度百科

在 Internet 中,Cookie 实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。

Cookie 在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥作用 (此种 Cookies 称作 Session Cookies),一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上 (此种 Cookies 称作 Persistent Cookies) [3] 。

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie).

在WIN7中,谷歌cookies文件位置: 在WIN7中,谷歌cookies文件位置_百度知道

IE/Firefox/Chrome等浏览器保存Cookie的位置: IE/Firefox/Chrome等浏览器保存Cookie的位置 - lin___的博客 - CSDN博客

Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等。

Cookie中的内容大多数经过了加密处理,因此在我们看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。

当在浏览器地址栏中键入了Amazon的URL,浏览器会向Amazon发送一个读取网页的请求,并将结果在显示器上显示。这时该网页在你的电脑上寻找Amazon网站设置的Cookie文件,如果找到,浏览器会把Cookie文件中的数据连同前面输入的URL一同发送到Amazon服务器。服务器收到Cookie数据,就会在他的数据库中检索你的ID,你的购物记录、个人喜好等信息,并记录下新的内容,增加到数据库和Cookie文件中去。如果没有检测到Cookie或者你的Cookie信息与数据库中的信息不符合,则说明你是第一次浏览该网站,服务器的CGI程序将为你创建新的ID信息,并保存到数据库中。

Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递,例如,浏览器的打开或刷新网页操作。服务器将Cookie添加到网页的HTTP头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑中的Cookie设置选择是否保存这些数据。

不输入密码直接访问知乎

关于Cookie的原理、作用,区别以及使用 关于Cookie的原理、作用,区别以及使用 - webEmmet - CSDN博客

Cookie的处理分为:

服务器像客户端发送cookie

浏览器将cookie保存

之后每次http请求浏览器都会将cookie发送给服务器端

Cookie详解: Cookie详解 - 爱雨轩 - CSDN博客

cookie是由服务器发送给客户端(浏览器)的小量信息。

cookie是键值对形式存储的少量信息,那它有什么作用呢?

我们知道,平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接。这时我们就需要一个一直保持会话连接的机制。在session出现前,cookie就完全充当了这种角色。也就是,cookie的小量信息能帮助我们跟踪会话。一般该信息记录用户身份。

Cookie/Session机制详解: Cookie/Session机制详解 - 瞧字不识 - CSDN博客

浏览器的打开是会话的开始,浏览器的关闭是会话的结束。

打开一次浏览器到关闭浏览器算是一次会话

关于Cookie的知识的总结 : 关于Cookie的知识的总结 - p77ll9l53x的博客 - CSDN博客

cookie是什么,如何使用cookie? jingyan.baidu.com/artic

########################

session (计算机术语) session(计算机术语)_百度百科

Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

Session 是 用于保持状态的基于 Web服务器的方法。Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。

由于 Session 是以文本文件形式存储在服务器端的

Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运行这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。

Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 session 才是最方便的。

Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 session ID。

如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 session 生存期的角色。

假设客户端禁用 Cookie 怎么办?没办法,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册 Session。那么怎么传递 Session ID 呢?通过 URL 或者通过隐藏表单来传递,PHP 会自动将 session ID 发送到 URL 上,URL 形如:?PHPSESSID=bba5b2a240a77e5b44cfa01d49cf9669,其中 URL 中的参数 PHPSESSID 就是 Session ID了

但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?

要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分)

session的到底是做什么的? session的到底是做什么的? - h19910518的博客 - CSDN博客

首先,我大致的知道,session是一次浏览器和服务器的交互的会话

每次我们访问一个页面,如果有开启session,也就是有session_start() 时,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个PHPSESSID的cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成PHPSESSID这个cookie。由于默认生成的这个PHPSESSID cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。

我们大致总结下:HTTP请求一个页面后,如果用到开启session,会去读cookie中的PHPSESSID是否有,如果没有,则会新生成一个session_id,先存入cookie中的PHPSESSID中,再生成一个sess_前缀文件。当有写入$_SESSION的时候,就会往sess_文件里序列化写入数据。当读取的session变量的时候,先会读取cookie中的PHPSESSID,获得session_id,然后再去找这个sess_sessionid文件,来获取对应的数据。由于默认的PHPSESSID是临时的会话,在浏览器关闭后,会消失,所以,我们重新访问的时候,会新生成session_id和sess_这个文件。

带你揭开session的面纱 blog.csdn.net/hsf157686

session是什么,怎么用? jingyan.baidu.com/artic

好好理解一下session blog.csdn.net/yang_ge_9

##############################

单点登录: 单点登录_百度百科

单点登录(Single Sign On),简称为 SSO。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

什么是单点登录?: 什么是单点登录? - 南京测试汪 - 博客园

单点登录的三种实现方式: 单点登录的三种实现方式 - CNode技术社区

实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性

单点登录原理与简单实现: 单点登录原理与简单实现 - ywlaker - 博客园

「单点登录与权限管理」系列概述 「单点登录与权限管理」系列概述-情情说-51CTO博客

单点登录与权限管理本质:session和cookie介绍 blog.51cto.com/13714880

单点登录与权限管理本质:HTTP重定向 单点登录与权限管理本质:HTTP重定向-情情说-51CTO博客

单点登录需要在多个web项目之间相互跳转,使用重定向技术,自动完成登录操作。

在HTTP协议中,服务器通过发送特定的响应实现重定向,浏览器在接收到响应后,可根据状态码判定重定向,并使用指定的新URL重新请求。重定向的响应状态码为3xx,不同的状态码表示不同的重定向类型。

浏览器从响应头中的Location获取新的URL,重新发送请求。

首先要区分开转发和重定向的概念,转发是在服务端完成的,浏览器地址栏中的地址不会改变,是一次请求;重定向是在浏览器端完成的,浏览器地址栏会变化,是二次请求。

单点登录与权限管理本质:单点登录介绍 单点登录与权限管理本质:单点登录介绍-情情说-51CTO博客

所谓单点登录,就是说用户只需在一个地方登录,访问其他相关系统时,不需要重复登录,隐式地自动登录,这样体验会比较好。

单点登录与权限管理本质:单点登录介绍 单点登录与权限管理本质:单点登录介绍-情情说-51CTO博客

常见单点登录协议

单点登录与权限管理本质:cookie安全问题 单点登录与权限管理本质:cookie安全问题-情情说-51CTO博客

单点登录与权限管理本质:权限管理介绍 单点登录与权限管理本质:权限管理介绍-情情说-51CTO博客



#################

SAML SAML_百度百科

SAML即安全声明标记语言,英文全称是Security Assertion Markup Language。

用于在不同的安全域(security domain)之间交换认证和授权数据

在SAML标准定义了身份提供者(identity provider)和服务提供者(service provider),这两者构成了前面所说的不同的安全域。

简单说, SAML就是一方向另一方发送SAML 请求,然后另一方返回SAML响应。数据的传输以符合SAML规范的XML格式表示。 连接中的任何一方都可以发起请求, 根据身份不同, 可以说是IDP init请求, 或是SP init 请求。

这里以SAML实现的业界领先厂商的PingFederate为例,来说说IDP init SSO (详细流程可以参阅参考资料)。 这个是用户通过LDAP 等登录到IDP域后, IDP 给已经登录的用户生成一个SAML Asseration, 这里包括员工的身份信息。 这个信息通过SSL加密传递到SP 后, SP 先验证签名(Sign), 解析出这是一个来自某公司某员工的请求, 要访问它的某个应用程序(Relaystat), SP 会继续把这个要求传递给自己的应用程序, 由它来决定授权。

由于SAML在两个拥有共享用户的站点间建立了信任关系,所以安全性是需考虑的一个非常重要的因素。SAML依靠一批制定完善的安全标准,包括SSL和X.509,来保护SAML源站点和目标站点之间通信的安全。


我眼中的SAML (Security Assertion Markup Language) 我眼中的SAML (Security Assertion Markup Language)

SAML在SSO中的应用 SAML在SSO中的应用 - CN.SnailRun - 博客园

认证与授权——单点登录协议盘点:OpenID vs OAuth2 vs SAML 认证与授权--单点登录协议盘点:OpenID vs OAuth2 vs SAML

SAML2.0 协议初识(一)有源代码 SAML2.0 协议初识(一) - 浅夏丶未央 - 博客园

java实现简单的单点登录 java实现简单的单点登录 - J2EE社区 - BlogJava

SAML2.0入门指南 SAML2.0入门指南

OpenSAML 使用引导 I : 简介——关于OpenSAML你所需知道的一切 OpenSAML 使用引导 I : 简介——关于OpenSAML你所需知道的一切

OpenSAML 使用引导 II : Service Provider 的实现之AuthnRequest OpenSAML 使用引导 II : Service Provider 的实现之AuthnRequest

OpenSAML 使用引导 III: Service Provider 的实现之Artifact与断言 OpenSAML 使用引导 III: Service Provider 的实现之Artifact与断言

OpenSAML 使用引导 IV: 安全特性 OpenSAML 使用引导 IV: 安全特性

OpenSaml——SAML协议的一种开源实现

OpenSAML是一个便于使用SAML消息的依赖库,其提供的主要功能包括:

创建SAML消息;

解析SAML对象并导出为XML格式;

签名和加密;

对SAML消息进行编码并传输。

代码下载地址: sunrongxin7666/OpenSAML-ref-project-demo-v3

加载maven项目后运行本项目


然后在浏览器输入 localhost:8080/webprofi

点击回车后


上图中的location的值为

localhost:8080/webprofi

那么就访问location这个新网址,下图的请求网址即是


现在我们解析上面发生的代码过程,首先在浏览器输入了 http://localhost:8080/webprofile-ref-project/app/appservlet

首先匹配


查看AccessFilter.java文件

初始化SAML服务

然后看session中是否已经登录了,发现没有登录

记录将本来要访问的目标路径( http://localhost:8080/webprofile-ref-project/app/appservlet )保存到Session的gotoURL字段

然后创建saml的AuthnRequest对象

AuthnRequest对象包含:

1.目标URL:目标地址,IDP地址:" localhost:8080/webprofi "

2.传输SAML断言所需要的绑定:也就是用何种协议使用Artifact来取回真正的认证信息

3.SP地址: 也就是SAML断言返回的地址:" localhost:8080/webprofi "

4.Issuer: 发行人信息,也就是SP的ID,一般是SP的URL

5.请求的ID:为当前请求设置ID,一般为随机数

6.NameID:IDP对于用户身份的标识;NameID policy是SP关于NameID是如何创建的说明

7. 请求认证上下文(requested Authentication Context): SP对于认证的要求,包含SP希望IDP如何验证用户,也就是IDP要依据什么来验证用户身份。

然后传送内容到IDP端" localhost:8080/webprofi "

传送内容包含公钥

查看SingleSignOnServlet.java文件

可以看到访问了idp的地址,并且idp返回登录认证的页面

然后用户点击认证,在idp页面上进行认证



上图请求网址为

localhost:8080/webprofi

上图Location为

localhost:8080/webprofi

上图请求网址为

localhost:8080/webprofi

上图Location为 " localhost:8080/webprofi "

下面讲解上面的几幅图片

首先讲解post接口

localhost:8080/webprofi

转发到

localhost:8080/webprofi

然后


创建ArtifactResolve对象

ArtifactResolve对象包含:

1.destination URL:" localhost:8080/webprofi "

2.证书

发送消息给" localhost:8080/webprofi "



创建ArtifactResponse对象并返回

ArtifactResponse对象包含:

1.目的地:" localhost:8080/webprofi "

然后ConsumerServlet.java接收到返回值,并校验返回值

然后转发到 http://localhost:8080/webprofile-ref-project/app/appservlet

首先

执行chain.doFilter(request, response);把请求下发给另一个匹配的Filter对象,如果没有Filter对象了,就下发给web.xml中的对应servlet-mapping


编辑于 2018-10-09 14:44