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