cas 在.net 下的单点登录实现及 ,Net Mvc的接入
最近在研究单点登录,发现用的最广的就是cas了,查了下资料,发现有人写了详细的说明
地址:http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870838.html
记录下我按照上面的文章搭建cas遇到的坑
1.我下载的tomcat是8.5的,发现按照上面的配置方法,SSL死活配不通,去网站下了7.0的就可以
2.循环重定向的问题,按上面的方法进行了修改和配置还是会出现循环重定向,直到删除了配置文件authentication节点下的path,就OK了
然后是测试在使用.Net Mvc接入Cas
1.先配置好了webconfig,参数以及httpmodel注册等
2.写好自己的验证控制器
public override void OnAuthorization(AuthorizationContext filterContext) { if (!HttpContext.Current.User.Identity.IsAuthenticated) { DotNetCasClient.CasAuthentication.RedirectToLoginPage(); return; } else { HttpContext.Current.Session["UserName"] = CasAuthentication.CurrentPrincipal.Identity.Name; } }
3.在自己的控制器上写下该特性,然后访问网站就能跳转到CAS的登录网站,调试的时候发现客户端在连接的时候会多次在服务器和客户端之间跳转,尝试连接-获取票据-连接成功返回,貌似就是这么个过程
[CasFilter] public ActionResult Index() { return View(); }
4.做完单点登录,做单点注销,发现几个问题,
1)调用CAS的注销地址:serverip/cas/logout是可以正常注销的
2)使用post调用SingleSignOut方法是无效的;
3)SingleSignOut方法会产生一个重定向,即跳转到服务器进行注销,但这个重定向有一个回调地址,也就是你注销时调用的控制器,比如 Account/Logout,这样会再次跑到你的注销方法里面去,在过认证过滤器的时候,因为已经注销就会跳转到认证登陆界面,此时的访问的是logout的控制器,因此登陆回调地址还是logout,so,死循环了,登陆-注销-登陆-注销
4).鉴于上述原因,在logou方法中调用SingleSignOut后手动重定向到Home/Index,但是这样又有一个问题,singleSignOut调用的重定向执行时间可能比执行重定向到主页慢,这样能正常跳转,但是会明显的看到浏览器地址栏有两次跳转,暂时没想到其他的好办法去解决这个问题;
5.在做登陆判断的时候一开始用的是CasAuthentication.CurrentPrincipal是否有值来判断,但发现无论是登陆和注销都会要多次刷新界面才有效果的情况,所以改用asp.net提供的验证字段来判断
6.昨天又发现个问题,MVC客户端取不到cas登陆用户的详细信息,调试后发现是响应信息XML序列化的时候找不到对应的字段导致直接被过滤掉了,而且获取信息的地方也没有传值过去,修改源代码添加对应的字段,手动传参
7.今天又发现了个悲剧的问题,编辑器中的富文本内容传不过去,其实在后台是已经使用了MVC的ValidateInput(false),但子啊经过cas的httpmodul时,还是抛错了,修改配置文件,禁用掉整个web的验证有效果,但这样做好像太不安全了。
8.鉴于安全原因将html内容使用js的encodeURIComponent编码后再传到后台,再后台再解码就行了。