2008-11-03 75 views
2

我們有一個使用集中式驗證服務器(CAS)進行單點登錄的應用程序。我們希望進行單點登錄,例如,如果用戶從一個應用程序(例如前端門戶)註銷,用戶將自動使用同一單點登錄票簽出所有應用程序。我是否可以從發出請求的會話中放棄InProc ASP.NET會話?

期望的是每個應用程序在登錄到該應用程序時都會註冊一個帶有CAS的註銷掛鉤(URL)。當CAS從其中一個應用程序收到註銷請求時,它會爲共享SSO票證的所有應用程序調用註銷掛鉤。

我的問題是:有沒有辦法從一個不同的會話中放棄一個InProc會話?我認爲,由於HTTP請求將來自CAS服務器,它將獲得它自己的會話,但它是我想要終止的用戶會話。我非常清楚如何使用單獨的會話狀態服務器來完成此操作,但是我想知道是否可以使用InProc會話狀態。

回答

2

在做了一些挖掘並考慮到目前爲止提供的答案之後,我想出了一個讓我繼續使用InProc會話的替代方案。基本上,它包括將已經處理單點登錄的HttpModule擴展到檢測到的CAS簽名並將瀏覽器重定向到應用程序註銷頁面。

大綱:

登錄:

  1. 對於每一個新的單點登錄請求,創建一個新的SSO cookie,並編碼獨特的價值在它標識會話(而不是會話ID ,所以不會泄露)。
  2. 構建註銷回調URL,使用標識符進行編碼,並將其註冊到CAS服務器。

登出:

  1. 當從CAS服務器接收的簽出請求,解碼所述標識符並將其存儲在一個應用範圍的高速緩存。這需要在緩存中固定至少足夠長的時間,以使會話自然過期。
  2. 對於每個請求,查找SSO cookie並根據緩存的註銷會話標識符檢查其值。如果遇到問題,請移除SSO Cookie並將瀏覽器重定向至應用程序的註銷網址。
  3. 對於每次註銷,請檢查是否有SSO cookie,如果是,請將註銷請求轉發給CAS。無論如何,放棄用戶的會話,並將其簽出應用程序。

的Page_Load:

  1. 檢查的SSO cookie的存在。如果沒有,則重定向到註銷頁面。
1

隨着SessionState的是InProc,您將無法訪問數據...隨着StateServer的,你仍然有粘性的場景試圖訪問正確的API來拆除會話。

您很可能希望使用像預打包的SqlServer狀態提供商或第三方解決方案像DOTSS數據庫支持國家的解決方案:http://codeplex.com/dotss

與數據庫備份解決方案,您將能夠來查找按會話ID在表中記錄狀態記錄並將其標記爲已完成。這些技術將根據您選擇的提供商而有所不同。

3

哈哈,好吧......看起來你可以。我在想自己是否有辦法做到這一點,事實證明,有。

當您使用InProc時,InProcSessionStateStore(內部類)會將會話狀態保留在內部(非公用)緩存中。您可以通過反射訪問此緩存並手動刪除會話狀態。

using System; 
using System.Reflection; 
using System.Web; 

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static) 
     .GetValue(null, null); 

if (obj != null) 
{ 
    MethodInfo remove = obj.GetType() 
     .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
      Type.DefaultBinder, new Type[] { typeof(string) }, null); 

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID }); 
} 

最終的結果是,下一個請求將在相同的SessionID,但HttpSessionState將是空的。你仍然會得到Session_Start和Session_End事件。

+0

這會議狀態的工作不會存儲在過程?如果不是,對於非InProc場景,最好的方法是做什麼? – 2014-02-13 14:11:40