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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM