关于CAS是个什么东西,就很少闲扯了,相信每一个有过SSO经验的都听过CAS大名,百度百科地址:git
https://baike.baidu.com/item/CAS/1329561?fr=aladdingithub
项目所用https:/github.com/apereo/dotnet-cas-client数据库
在.Net 中集成CAS 网上也有不少的教程,关于无限重定向的解决方案,网上也有众多解决方案,第一点就是<sessionState>节点的配置,这个简单扯一下,在.Net 中,session有四种存储方式,而sessionState节点的mode模式有4种,分别为Off、InProc、StateServer、SqlServer。 四种存储方式分别为自定义数据存储、IIS进程、状态服务器、数据库。默认状况下,session保存在IIS进程中,其默认超时时间为20分钟。服务器
值cookie |
说明session |
Customless |
会话状态将使用自定义数据存储区来存储会话状态信息。spa |
InProcblog |
会话处于正在处理 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,咱们作的就是加上了这个属性,让其成功反序列化,从而获取结果。