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