.Net 接入CAS 遇到的坑
关于CAS是个什么东西,就不多闲扯了,相信每个有过SSO经验的都听过CAS大名,百度百科地址:
https://baike.baidu.com/item/CAS/1329561?fr=aladdin
项目所用https:/github.com/apereo/dotnet-cas-client
在.Net 中集成CAS 网上也有很多的教程,关于无限重定向的解决方案,网上也有众多解决方案,第一点就是<sessionState>节点的配置,这个简单扯一下,在.Net 中,session有四种存储方式,而sessionState节点的mode模式有4种,分别为Off、InProc、StateServer、SqlServer。 四种存储方式分别为自定义数据存储、IIS进程、状态服务器、数据库。默认情况下,session保存在IIS进程中,其默认超时时间为20分钟。
值 |
说明 |
Custom |
会话状态将使用自定义数据存储区来存储会话状态信息。 |
InProc |
会话处于正在处理 ASP.NET 辅助进程的状态。 |
Off |
会话状态被禁用。 |
StateServer |
话状态将使用进程外 ASP.NET 状态服务来存储状态信息。 |
SQLServer |
会话状态将使用进程外 SQL Server 数据库来存储状态信息。 |
一般情况下,解决无限重定向,我们只需要配置sessionState 节点为<sessionState mode="StateServer" cookieless="UseCookies" timeout="1440"></sessionState> timeout 即为超时时间,单位为分钟,这个根据实际情况可自由配置。
关于其他的配置就不多说了,官方文档讲述的很详细。
这次所遇到的坑 就是,在对接其他公司提供的CAS平台时,我们需要获取到平台返回的用户信息,默认情况下,能够获取到的只是当前用户名,不太容易满足我们的需求。在CAS服务端进行配置,可以获取到用户的扩展属性,比如ID、类型、邮箱、头像等等。客户所提供的文档 有Java、Python、Php的实现方案,从attributes里获取用户的基本信息,.Net平台下官方文档对此没有介绍,开始盲人摸象。看源代码,发现在 Assertion 下有Attributes属性,开始尝试使用,起初获取信息代码为:
var user = HttpContext.Current.User;
var casPrincipal = (ICasPrincipal)user;
var dict= casPrincipal.Assertion.Attributes;
但是我发现,无论怎么整,获取的attributes总为null。所以一直在想,到底是我的代码不对,还是他们给的文档不对,网上没有找到对应的解决方案,无奈只有回到百科查看cas介绍。一张图点亮了我:
这是百科上的cas协议图,结合实际情况,项目确实成功集成了CAS,登录成功后确实跳转到了我们的客户端,思路主要在第5步上,服务端在验证service ticket以后才会返回给我们用户信息,所以就在这里跟代码,看服务端到底返回给了我们什么信息。代码在TicketValidator这一块,
可以看到,服务端确实成功返回给了我们用户扩展属性。在这里吐槽一下某公司,给的文档完全和这信息不匹配。
既然服务端成功返回给了我们数据,为什么没有格式化拿到数据呢,接着往下走
发现在这里少了Attributes属性,故加上Attributes属性,格式如上,
[XmlElement("attributes")]
public object Attributes
{
get;
set;
}
代码接着往下走,如下图所示,在所处位置加上如下代码,解析attributes构造成一个字典,并附加到Assertion的Attributes中即可。
还是起初获取用户信息的代码,在Attributes中便可获取到服务端返回的扩展信息。
这种解决方案不会适配所有情况,但是目前解决了我的问题,各位有好的解决方案希望能够提供。
到此结束,主要问题就是DotNetCasClient这个库在反序列化信息的时候,丢失了attributes,我们做的就是加上了这个属性,让其成功反序列化,从而获取结果。
.Net 接入CAS 遇到的坑的更多相关文章
- 《转》iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑
最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...
- 轻松搭建CAS 5.x系列(4)-Java客户端程序接入CAS单点登录,Hello World版
概述说明 按照本系列的前3篇文章描述的步骤,我们已经搭建好cas sso server.那应用程序怎么接入到实现sso呢? (如果您还没有搭建cas server,可以到<轻松搭建CAS 5.x ...
- spring mvc 接入cas登录
费劲千辛万苦开发出来的系统要接入sso 让我头大还好有大佬帮忙 首先在配置文件中写入启动的ip地址 HOST=http://127.0.0.1:8080/ 地址写你的地址和端口 然后在pom文件中导入 ...
- 手游接入Facebook的那些坑
之前工作须要在手游中接入了facebook,并以此写了<手游接入Facebook功能>的博文.当时facebook sdk的版本号还是3.x.代码集成度比較低.集成起来也比較麻烦.文中仅仅 ...
- cas 在.net 下的单点登录实现及 ,Net Mvc的接入
最近在研究单点登录,发现用的最广的就是cas了,查了下资料,发现有人写了详细的说明 地址:http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870 ...
- CAS客户端整合(一) Discuz!
有好几个系统需要接入CAS,所以登录模块统统需要重构 版本 CAS服务端是Java的 Cas-server-4.0 CAS的php客户端 是 phpCAS-1.2.0 论坛版本是 Discuz!X3. ...
- CAS企业级单点登录原理
https://blog.csdn.net/anumbrella/article/details/80821486 1. 单点登录概述 1.1. 什么是单点登录? 单点登录:Single Sign O ...
- CAS实现SSO 单点登录
结构 CAS分为两部分,CAS Server和CAS Client CAS Server用来负责用户的认证工作,就像是把第一次登录用户的一个标识存在这里,以便此用户在其他系统登录时验证其需不需要再次登 ...
- 微信公众号开发--.net core接入
.net进行微信公众号开发的例子好像比较少,这里做个笔记 首先,我们需要让微信能访问到我们的项目,所以要么需要有一个可以部署项目的连接到公网下的服务器,要么可以通过端口转发将请求转发到我们的项目,总之 ...
随机推荐
- php调用第三方接口
方式一 $url = 'http://ip.taobao.com/service/getIpInfo.php?ip='.$realip;$data = file_get_contents(" ...
- node.js 递归复制文件夹(附带文件过滤功能)
1.简介: 很简单,写了一个node操作文件的小脚本,主要实现对目标文件夹中内容的复制.还顺带一个按照文件夹或者文件名过滤的功能. 2.应用场景 适合基于 node 环境的项目,项目打包的时候,配合 ...
- post数据时报错:远程服务器返回错误: (400) 错误的请求。
网上查了多种方法,有不少说法,报400说是传的数据格式不对,最后的结论确实是数据格式不对. Content_Type为:application/json,配的数据格式有些麻烦,特别数多层,单层还好.例 ...
- 【逆元】HDU-1576
逆元: 同余方程 ax≡1(mod n),gcd(a,n) = 1 时有解,这时称求出的 x 为 a 的对模n的乘法逆元.(注意:如果gcd(a,n)如果不等于1则无解),解法还是利用扩展欧几里得算法 ...
- 发一些Java面试题,上海尚学堂Java学员面试遇到的真题,值得学习
1. 下面哪些是Thread类的方法() A start() B run() C exit() D getPriority() 答案:ABD 解析:看Java AP ...
- java前后分离使用fetch上传文件失败500
这次不是写什么技术要点,仅仅是记录一下 最近遇到的一个问题 背景 使用fetch向java后台上传文件时,前端调试报错500,后端的报错为multipart 无法解析,翻译过来大概是这个意思. 由于本 ...
- [Swift]LeetCode598. 范围求和 II | Range Addition II
Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...
- [Swift]LeetCode856. 括号的分数 | Score of Parentheses
Given a balanced parentheses string S, compute the score of the string based on the following rule: ...
- innerHTML,outerHTML,innerText,outerText
- innerHTML 设置或获取位于对象起始和结束标签内的 HTML - outerHTML 设置或获取对象及其内容的 HTML 形式 - innerText 设置或获取位于对象起始和结束标签内的文 ...
- Python内置函数(25)——getattr
英文文档: getattr(object, name[, default]) Return the value of the named attribute of object. name must ...