当前位置: 首页 > news >正文

CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解

CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解


tomcat版本: tomcat-8.0.29

jdk版本: jdk1.8.0_65

nginx版本: nginx-1.9.8

cas版本: cas4.1.2
cas-client-3.4.1

参考来源:

jasig.github.io:CAS protocol

https://github.com/Jasig/java-cas-client

通过Proxy访问其它Cas应用

CAS负载均衡配置——SSL篇

CAS负载均衡配置

CAS客户端集群

  • 以下的示例采用我博客的另外两篇文章中搭建好的测试环境举例

CAS (1) —— Mac下配置CAS到Tomcat(服务端)

CAS (2) —— Mac下配置CAS到Tomcat(客户端)

CAS (3) —— Mac下配置CAS客户端经代理访问Tomcat CAS

Mac为nginx安装nginx-sticky-module

【高可用HA】Nginx (1) —— Mac下配置Nginx Http负载均衡(Load Balancer)之101实例

Nginx (2) —— Mac下配置Apache Httpd的Https/SSL (待出)

目标架构

613455-20151217095721396-1141430139.png

此代理非彼代理

在CAS官方网站上给出了一个“Proxy Web Flow Diagram”:

613455-20151217094901068-1204662614.png

613455-20151217094915162-1105993705.png

顺序图:(来源于http://jasig.github.io/cas/4.0.x/protocol/CAS-Protocol.html)

这个方案主要适用一种场景:

有两个应用App1和App2,它们都是受Cas Server保护的,即请求它们时都需要通过Cas Server的认证。现需要在App1中通过Http请求访问App2,显然该请求将会被App2配置的Cas的AuthenticationFilter拦截并转向Cas Server,Cas Server将引导用户进行登录认证,这样我们也就不能真正的访问到App2了。针对这种应用场景,Cas也提供了对应的支持。通过Proxy访问其它Cas应用

无论是用中文关键字在“度娘”,还是用英文关键字再“谷哥”上搜索,多数文章都是描述上面这样一个场景。

而我这里介绍的“代理”,并非是上述场景——依靠代理去验证ticket,“代理”在此的角色是:

  • 只做分发反向代理(未来的负载均衡器)
* 注意:所以说“此代理非彼代理”

准备

要搭建上面这个环境会相对复杂,我们需要参照之前的文章准备以下必备的组件或环境:

CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解

测试

  1. 访问“https://app1.hoau.com:8413/cas1”

    613455-20151217112353990-397652019.png

    会重定向到“https://proxy.sso.hoau.com/cas/login?service=https%3A%2F%2Fapp1.hoau.com%3A8413%2Fcas1”

  2. 然后输入用户明密码(test01/psw01)

    如果验证成功,则会将浏览器重定向到app1的登陆成功页面。

    613455-20151217112407771-1654378095.png

  3. 再次访问“https://app1.hoau.com:8413/cas1”

    可以直接进入登陆成功页,而无需输入用户名密码。

  4. 访问另一应用

    同样可以通过test01用户直接进入登陆成功页,而无需输入用户名密码。

    613455-20151217112423193-1368642199.png

上面基本测试通过,我们接着分析网络顺序。

代理下的网络顺序分析

由于这个场景较为简单,所以jasig官网上并没有给出这个场景下的网络顺序图。于是我自己画了一个。

613455-20151217151617881-1176076397.png

仔细观察可以发现:上图与不通过nginx代理时,官网的序列图类似,只有代理出多了转发和反向的工作。

首次访问

https://app1.hoau.com:8413/cas1
(0)用户通过浏览器访问上面地址

613455-20151217155515443-1838044077.png

(1)浏览器访问Protected App #1
(2)Protected App #1尝试验证身份

首次登陆,身份验证未通过,返回重定向消息

302 Location 
https://proxy.sso.hoau.com:443/cas/login
    ?service=https://app1.hoau.com:8413/cas1
(3)浏览器重定向以上地址至代理服务器Proxy
(4)Proxy将次请求分发至CAS服务器

613455-20151217155714490-288424364.png

https://sso.hoau.com:8433/cas/login
    ?service=https://app1.hoau.com:8413/cas1
    

CAS服务器发现用户没有SSO的Session,然后返回CAS的登陆页面内容

(5)返回CAS的登陆页面内容至代理服务器
(6)代理将响应的内容返回给浏览器
(7)浏览器为用户呈现登陆页面

613455-20151217155757724-1380009767.png

(8)用户提交用户名和密码

613455-20151217155859615-411815250.png

(9)浏览器提交Form内容至代理
(10)代理转发提交的内容至CAS服务器
(11)CAS服务器验证用户身份
(12)CAS服务器返回相应至代理

613455-20151217160040693-254130040.png

(13)代理将响应返回给浏览器

并且设置Cookie

CASTGC

由于身份验证成功,此刻浏览器被要求重定向至Protected App #1的登陆页

(14)浏览器被重定向至Protected App #1

并且携带ticket信息。

613455-20151217160120912-743606401.png

*注意:以下(15)、(16)、(17)和(18)步为Protected App #1与CAS Server背后的交互。

Protected App #1 收到请求后,会再次访问CAS Server以验证ticket。

(15)(16)Protected App #1通过Proxy请求serviceValidate
(17)(18)CAS服务器经由代理返回响应信息
(19)如果CAS服务器校验通过

则会设置Cookie JSESSIONID,然后将重定向信息返回到浏览器

(20)浏览器再次访问Protected App #1

613455-20151217160259662-409971803.png

并携带有效的JSESSIONID,这时

如果验证通过,则

(22)返回目标页面的内容

613455-20151217160226302-1137370308.png

再次访问

https://app1.hoau.com:8413/cas1

另一个应用访问

https://app2.hoau.com:8423/cas2

以上“再次访问”和“另一应用访问”不在赘述,大家可以自行测试,或参考无代理情况下的序列图:

CAS (4) —— CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example)

附一个Charles的http顺序图

613455-20151217150616271-1726676114.png

结束

相关文章:

  • 函数分析题
  • 使用 Kanban精益创新
  • Override使用对象
  • android studio 2 3 的maven坑
  • SSM框架
  • 内核定时器的简单应用
  • python编程笔记--字符编码
  • 增、删、改、查,数据库和表操作
  • Confluence 6 管理和恢复空间管理权限
  • iOS 系统授权开发
  • Kubernetes首爆严重安全漏洞,请升级你的Kubernetes
  • oracle asm amdu和dd使用
  • shell脚本编程之“最简单的死循环”【转】
  • 用户,组和权限零碎知识
  • Java 与 PHP 的MD5加密方法
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular 2 DI - IoC DI - 1
  • CentOS7简单部署NFS
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • js中forEach回调同异步问题
  • Redis中的lru算法实现
  • Swift 中的尾递归和蹦床
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 翻译:Hystrix - How To Use
  • 分布式熔断降级平台aegis
  • 构建二叉树进行数值数组的去重及优化
  • 离散点最小(凸)包围边界查找
  • 目录与文件属性:编写ls
  • 全栈开发——Linux
  • 微服务框架lagom
  • 我有几个粽子,和一个故事
  • 详解移动APP与web APP的区别
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​io --- 处理流的核心工具​
  • ​TypeScript都不会用,也敢说会前端?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #1014 : Trie树
  • #define 用法
  • (2)Java 简介
  • (7)STL算法之交换赋值
  • (solr系列:一)使用tomcat部署solr服务
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (算法)N皇后问题
  • (学习日记)2024.01.19
  • (转)c++ std::pair 与 std::make
  • (转)JAVA中的堆栈
  • (转)大道至简,职场上做人做事做管理
  • (转)人的集合论——移山之道
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(一):@echo off
  • .cn根服务器被攻击之后