.Net 接入CAS 遇到的坑

關於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,咱們作的就是加上了這個屬性,讓其成功反序列化,從而獲取結果。

相關文章
相關標籤/搜索