转自:http://www.cnblogs.com/xingshao/archive/2011/09/29/2195746.html

近期的一个项目,项目包含了若干的子系统,因为人员配备的原因,项目会包含不同开发语言编写〔java、.net〕的几个子系统。项目从企业应用集成的角度进行架构,除了在应用层面上的“业务流程整合”之外。还有一个就是“身份认证”层面上的集成,身份认证的整合应用了CAS (Central Authentication Service),它是Yale 大学的 ITS 开发的一套 JAVA 实现的开源的SSO(single sign-on)的服务。

Cas的部署、实现在java项目系统中都很顺利的架设,实现了。但是在.net子系统中遇到了问题,.net下的集成是我今天要说的。

.net集成之初,参考了官上的范例(http://www.jasig.org/cas),它也提供.net客户端的源码下载。但是在调试的时候,出现了“循环请求验证”的现象,Ie的现象是“一直登录”,火狐下直接提示“循环访问”一类的错误。

首先在google直接找解决方法,但是遗憾的是并没有直接解决类似问题的信息。有几篇文章提到了这个现象,但是并没有提出解决方案,msdn中有这个问题,但是回复者都是三言两语,没有详细的解决方案,有的回答说“官网提供的是个半成品”。无语..暂且信之吧。

问题总是要解决的,以前没有实际使用过这个东西,所以还是从头开始吧,googel了一些cas的知识,对cas的机制,应用过程进行了解。

(具体知识详见 http://linliangyi2007.iteye.com/blog/165310说的很通俗〕。

Cas .net版本的客户端.是结合了asp.net自身的forms认证实现认证的。它是通过编写一个httpModel进行拦截,通过对客户端票据〔ticket〕的检查来实现对每一次请求的过滤,进而达到对功能页面的控制。首先在web.config中要配置一系列的cas服务端的参数信息,直接贴出

<configSections>

<sectionname="casClientConfig"type="DotNetCasClient.Configuration.CasClientConfiguration, DotNetCasClient"/>

</configSections>

<casClientConfig

casServerLoginUrl="http://192.168.12.196/cas/login"

casServerUrlPrefix="http://192.168.12.196/cas"

serverName="http://localhost:3273/ExampleWebSite"

notAuthorizedUrl="~/NotAuthorized.aspx"

cookiesRequiredUrl="~/CookiesRequired.aspx"

redirectAfterValidation="true"

gateway="false"

renew="false"

singleSignOut="true"

ticketTimeTolerance="5000"

ticketValidatorName="Cas20"

serviceTicketManager="CacheServiceTicketManager"

gatewayStatusCookieName="CasGatewayStatus" />

<system.web>

.net 自己的Forms认证这的配置也很重要,

<authenticationmode="Forms">

<forms

loginUrl="http://192.168.12.196/cas/login"

timeout="30"

defaultUrl="~/Default.aspx"

cookieless="UseCookies"

slidingExpiration="true"

path="/ExampleWebSite/"

/>

</authentication>

<authorization>

<denyusers="?"/>

<allowusers="*"/>

</authorization

最后就是httpModel的配置了

<httpModules>

<addname="DotNetCasClient"type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/>

</httpModules>

至此cas的基础配置完成了,但是这是不够的,这个的配置并没有错,但是实际运行中就会出现上述的“循环验证”的问题,通过分析代码,发现循环重定向到login页面的原因是每一次的验证都是失败,票据丢失,会话状态丢失。这个是引起循环重定向的直接凶手,

请求系统页面-->httpModel重定向à cas登录页à登录后的系统页面àhttpModel验证ticket失败à重定向登录cas

这个过程周而复始,那么问题的核心在那呢?.“httpModel验证失败”,这个是整个问题过程中的核心,通过调试,最终也确定了导致失败的最终代码段。

httpModel

CasAuthenticationTicket casTicket = null;

FormsAuthenticationTicket formsAuthenticationTicket = GetFormsAuthenticationTicket();

if (formsAuthenticationTicket != null)

{

ICasPrincipal principal;

if (ServiceTicketManager != null)

{

string serviceTicket = formsAuthenticationTicket.UserData;

casTicket = ServiceTicketManager.GetTicket(serviceTicket);

if (casTicket != null)

没有发现票据,也就是说票据实失效引起的cas 认证的重定向登录,那么是谁引起的ticket的失效呢?.最终排除了cas客户端和服务端的问题,也就是说cas 配置是正确的,??那是什么引起最初的“循环重定向”现象呢。“Asp.net forms 验证下的session失效”,问题由cas踢给.net自己的问题。最终问题再次转移了,变成了“在.net下,session失效的问题”,但是也看到了曙光,因为这个问题googel一下.会有太多的信息供你浏览。同时,我发现我被“java 、cas”这样的词误导了。基于.net的cas集成本身并不全是“cas”的问题,.net也是整合的一部分。

直接增加配置:

<sessionStatemode="StateServer"cookieless="UseCookies"timeout="36000"></sessionState>

1、启用会话状态,

2、开始asp.net状态服务〔确保会话的持久,不在莫名其妙的失效。〕

3、对一些系统的页面进行页面缓存禁用,因为有几次..缓存的页面又一次误导了,让我以为cas的认证有问题。

通过解决asp.net的会话失效问题,发现应用cas后的“循环重定向”问题没有了。

最后要说一下cas的“登出”操作,“登出”必须要.net forms登出和 cas的服务端登出结合。一定要先将服务端会话Abandon,然后在对cookie进行过期操作。最后清清除cas服务端的验证票据。

FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value);

if (CasAuthentication.ServiceTicketManager != null && ticket.UserData.Length > 0)

{

CasAuthenticationTicket casTicket = CasAuthentication.ServiceTicketManager.GetTicket(ticket.UserData);

CasAuthentication.ServiceTicketManager.RevokeTicket(casTicket.ServiceTicket);

CasAuthentication.ClearAuthCookie();

Session.Clear();

this.Session.Abandon();

Request.Cookies.Remove(FormsAuthentication.FormsCookieName);

Page.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);

CasAuthentication.SingleSignOut();

至此,cas .net集成的问题彻底解决。本文强调的其实并不是解决“cas .net集成”这个现象,而是在解决这个现象的过程。在开发过程中,所有遇到的技术问题并不可怕,可怕的是你不知道如何去分析、分解问题,“大而化小,小而化了”才是解决问题的精髓。之所以说解决不了的问题,是因为你没有掌握分析、解决问题所必要的基础信息,比如“相关的领域知识”、涉及的技术特点。如果碰到了解决不了的问题,那肯定是在领域知识方面有欠缺,致使你不能分析、不能分解。

结论,在领域知识掌握到一定程度后,在领域范围内,你就是专家。

CAS 与.net 集成的 “循环重定向”问题分析的更多相关文章

  1. Apache本地环境下出现循环重定向

    最近发现一个很奇怪的问题,用了很久的apache+php访问项目,昨天突然不行了,出现了这个 然后我一点点测试,我用的是TP框架,Indexaciton的index中调用框架里的一个redirect函 ...

  2. CAS与LDAP集成

    参考文献: CAS集成ldap:https://wiki.jasig.org/display/CASUM/LDAP CAS集成restful api:https://wiki.jasig.org/di ...

  3. nginx和Tomcat集成后发生的重定向问题分析和解决

    nginx和Tomcat集成后发生的重定向问题分析和解决 Tomcat前端配置一个HTTP服务器应该是大部分应用的标配了,基本思路就是所有动态请求都反向代理给后端的Tomcat,HTTP服务器来处 理 ...

  4. Qt for windows消息循环、libqxt分析和wince快捷键处理

    Qt for windows消息循环.libqxt分析和wince快捷键处理 利用Qt做windows图形界面开发和MFC相比,个人感觉还是比较简单好用的:首先利用Designer工具搞个ui文件:然 ...

  5. 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  6. JavaScript 模块的循环加载(循环依赖问题分析)

    简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...

  7. Java 使用拦截器无限转发/重定向无限循环/重定向次数过多报错(StackOverflowError) 解决方案

    说明:当使用拦截器出现"请求转发"无限循环或者"重定向"次数过多这种问题的时候,一般都是 拦截器 设置错了 情况一:请求转发时没有配置排除拦截路径,就是说你访问 ...

  8. spring循环依赖问题分析

    新搞了一个单点登录的项目,用的cas,要把源码的cas-webapp改造成适合我们业务场景的项目,于是新加了一些spring的配置文件. 但是在项目启动时报错了,错误日志如下: 一月 , :: 下午 ...

  9. linux-shell数据重定向详细分析

    在了解重定向之前,我们先来看看linux 的文件描述符.linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写 ...

随机推荐

  1. 请把不听话的【return】关进【class】这个笼子

    请把不听话的[return]关进[class]这个笼子 问:powershell 最垃圾的语句是什么?答:(函数中的)return #例子1:函数中的return有时会返回所有内容,而不是你想要的内容 ...

  2. NAT模式下用secureCRT连接虚拟机

    VMWare制作学习系统,或布置模拟网络群组环境,已经比较流行. 注意主机端口要设置成为不同2122,虚拟机端口设置成22 笔者为了给项目组同事,提供一个练习ssh远程连接操作,及方便抓图交流的环境, ...

  3. SAP 增强-出口选找方法-全部

    ■ SAP 中如何寻找增强 方法一:利用TCODE寻找增强(第二代的增强) 执行一个程序(源代码后附),在选择屏幕处输入你所需要增强的程序TCODE,执行後,就会出现一个列表,那里就有关于如何增强这个 ...

  4. angular 国际化

    今天mentor说让我看看angular国际化的问题,我看了看,发现这个帖子很有价值,但是手头上还有好几个issue没有解决,所以就先考皮在这将连接,解决完这几个bug我再去细细研究这个问题, htt ...

  5. 生日蛋糕—dfs

    Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri ...

  6. Uri.AbsoluteUri 与 Uri.ToString() 的区别

    UriBuilder builder = new UriBuilder("http://somehost/somepath"); builder.Query = "som ...

  7. 对弈类游戏的人工智能(4)--游戏AI的落地

    前言: 对弈类游戏的智能算法, 网上资料颇多, 大同小异. 然而书上得来终觉浅, 绝知此事要躬行. 结合了自己的工程实践, 简单汇总整理下. 一方面是对当年的经典<<PC游戏编程(人机博弈 ...

  8. 有100个节点的AVL树最大深度是多少?

    首先说AVL树的概念 1 左右子树的深度差<=1 2 左右子树都是AVL树. 其实这样算,可以倒推的. 空树  DEPTH = 0; AVL_DEPTH = 2^0+2^1+......+2^k ...

  9. 关于java 中文乱码问题 自己的一点解决方案

    早上做导出的时候,url拼接参数中文出现了乱码.查了半天.终于中午搞定了. 在web.xml中加了转码过滤器,tomcat的server.xml中也加入URIEncoding="UTF-8& ...

  10. [vijos P1880]ファーラの力

    据说这是一道 JOI 的题?反正我觉着挺好的喵~ 题目看起来十分可怕,但是代码还是很短的 显而易见的,ans 因分为3个部分:1.中途增加光压的时间 2.中途减少光压的时间 3. 所有路程的总时间 发 ...