欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net 接入CAS 遇到的坑

程序员文章站 2022-03-20 09:33:23
关于CAS是个什么东西,就不多闲扯了,相信每个有过SSO经验的都听过CAS大名,百度百科地址: https://baike.baidu.com/item/CAS/1329561?fr=aladdin 项目所用https:/github.com/apereo/dotnet-cas-client 在.N ......

关于cas是个什么东西,就不多闲扯了,相信每个有过sso经验的都听过cas大名,百度百科地址:

https://baike.baidu.com/item/cas/1329561?fr=aladdin

项目所用

在.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介绍。一张图点亮了我:

.Net 接入CAS 遇到的坑

这是百科上的cas协议图,结合实际情况,项目确实成功集成了cas,登录成功后确实跳转到了我们的客户端,思路主要在第5步上,服务端在验证service ticket以后才会返回给我们用户信息,所以就在这里跟代码,看服务端到底返回给了我们什么信息。代码在ticketvalidator这一块,

.Net 接入CAS 遇到的坑

可以看到,服务端确实成功返回给了我们用户扩展属性。在这里吐槽一下某公司,给的文档完全和这信息不匹配。

既然服务端成功返回给了我们数据,为什么没有格式化拿到数据呢,接着往下走

.Net 接入CAS 遇到的坑

发现在这里少了attributes属性,故加上attributes属性,格式如上,

[xmlelement("attributes")]

public object attributes

{

get;

set;

}

代码接着往下走,如下图所示,在所处位置加上如下代码,解析attributes构造成一个字典,并附加到assertion的attributes中即可。

.Net 接入CAS 遇到的坑

还是起初获取用户信息的代码,在attributes中便可获取到服务端返回的扩展信息。

这种解决方案不会适配所有情况,但是目前解决了我的问题,各位有好的解决方案希望能够提供。

 

到此结束,主要问题就是dotnetcasclient这个库在反序列化信息的时候,丢失了attributes,我们做的就是加上了这个属性,让其成功反序列化,从而获取结果。