2010-04-21 18 views
1

我們正在嘗試使用PingFederate將ASP.NET MVC網站與我們客戶的SSO系統集成。我想使用內置的FormsAuthentication框架來做到這一點。我已經走了一下到目前爲止的方法是:.NET FormAuthentication標籤什麼時候被檢查,我如何利用這個事件?

  1. 設置我的Web.config讓我FormsAuthentication LoginURL變爲「安全」控制器上我的網站「BeginAuthentication」行動。通過這個動作,我設置了一些會話變量(例如,因爲Ping不會將這些信息發回給我),所以我設置了一些會話變量(例如訪問了哪個URL),然後重定向到我們客戶的外部站點上的登錄頁面(www.client.com)。例如com/Login)。

  2. 從這裏開始進行身份驗證,並在與我們的應用程序運行的相同的域上生成一個cookie,其中包含經過身份驗證的用戶的唯一標識符,我將其設置爲一旦這個發生時,Ping服務器將重定向到我的「安全」控制器上的「EndAuthentication」操作。

  3. 在此操作中,我調用我的成員資格類的「ValidateUser」方法,該方法從cookie中獲取此唯一標識符,並在我們的應用程序中加載此ID所引用的用戶。我將會話(例如會話[「LoggedInAs」))中登錄的用戶保存起來,並使包含SSO系統爲我提供的已認證用戶的ID的cookie過期。

所有這一切都很好。我想知道的問題是,在我們的用戶已經通過身份驗證並手動返回到客戶端的登錄頁面(www.client.com/login)並以另一個用戶身份登錄後會發生什麼。如果他們這樣做,那麼從#2到#3的流程正常發生 - 但由於在我們的網站上已經存在一個經過驗證的用戶,所以似乎FormsAuthentication系統不會打擾任何事情,所以我不會有機會檢查我正在尋找作爲這個新用戶登錄的cookie。我想要做的是,在我的Global.asax文件(可能是FormsAuthenticate_OnAuthenticate)中的某處,檢查是否存在SSO系統發送給我的cookie,如果存在,請使用FormsAuthentication.SignOut註銷應用程序( )。

另一個似乎相關的問題是,如果我讓我的會話過期,FormsAuthentication仍然認爲我已通過身份驗證,即使沒有當前登錄的用戶存在於我的會話中,它也允許我訪問頁面,因此頁面無法正確呈現。我是否應該在這裏使用Session_End事件並執行FormsAuthentication.SignOut()?

基本上,我想知道什麼時候通過 System.Web.Security.FormsAuthentication.SetAuthCookie(..)創建的身份驗證票證在請求流中被檢查,以便我可以確定是否需要SignOut()並強制重新確認或不。

感謝您的任何幫助。對不起,這封郵件的長度儘可能詳細。

穆斯塔法

回答

1

歡迎來到Hades的一小部分即將會話與formsauth混合。

如果您的需求與呈現的一樣複雜,如果您實施完整的供應商堆棧以在參與的站點之間共享,您將獲得更多睡眠。我知道,說起來容易做起來難。

不過來解決你的問題:從http://www.codeproject.com/Articles/39026/Exploring-Web-config-system-web-httpModules.aspx

論....檢查車票,並設置身份@

app.AuthenticateRequest += System.Web.Security.FormsAuthenticationModule.OnEnter-->OnAuthenticate 

在路上的出路...設置機票和必要時重定向

app.EndRequest += System.Web.Security.FormsAuthenticationModule.OnLeave 

Reflector是你的fr IEND。 ;-)

1

我不知道什麼時候該cookie將被檢查的特定事件,但你可以將相應邏輯Application_BeginRequest()並檢查用戶的認證狀態存在。

1

,這似乎是相關 另一個問題是,如果我讓我的會話過期, 的FormsAuthentication似乎仍然 覺得我驗證,它讓 我訪問一個頁面,即使當前登錄的用戶沒有 存在於我的 會話中,因此該頁面未正確呈現 。

該cookie的生命(直到ASP.NET感覺它需要再次要求密碼多久)以及您如何管理狀態是無關的。 ASP.NET身份驗證是基於cookie的,因此,如果開發人員想要,他可以關閉viewstate,session,不使用查詢字符串或隱藏字段,並且身份驗證仍然有效。

如果要將請求密碼的時間間隔與持久數據的持續時間綁定在一起,那麼您希望會話到期時間與Cookie到期時間大致相同,但它們永遠不會匹配。最好是有兩個策略(一個用於快速丟棄用戶會話數據,另一個用於在需要重新密碼之前願意等待多久)

相關問題