2008-10-15 60 views
1

我想在ASP.NET網站上實現表單身份驗證,站點應該在數據庫上尋找用戶以獲取一些數據,然後使用LDAP(Active Directory)進行身份驗證以驗證用戶/密碼組合。實現混合ASP.NET表單驗證(AD + DB)的最佳方式是什麼?

之後,我需要保持一個類的實例,代表用戶以各種形式使用它。

我試圖做一個登錄控制之前,檢查以前的條件,並做一個AuthenticateEventArgs.Authenticated = true並將該對象放在會話:Session ["user"] = authenticatedUser;,但我有問題同步他們兩個(會話過期之前身份驗證cookie和當頁面試圖使用現在不存在的會話對象時,我得到了NullReferenceExceptions)。

這是完成此操作的最佳方法嗎?有什麼方法可以將會話超時與Cookie壽命同步嗎?用戶對象應該以其他方式保存嗎?我有沒有錯過這一點?

謝謝。

更新: 我不能使用windows auth提供程序,因爲該網站應該從外面訪問priate網絡。

回答

1

我會使用Windows身份驗證作爲主要身份驗證提供程序,但是會爲我們自己的簡單數據庫持久性提供用戶信息。

您的會話方法可以工作,您可以調整IIS中的會話超時並將其與身份驗證cookie超時匹配。

此外,你可以做這樣的事情在一個HTTP模塊搭上邊的情況下(應用程序池回收等)也明確會議

僞代碼:

if (session["user"] == null) 
{ 
    Authentication.SignOut(); 
} 

這會迫使用戶進行身份驗證。

+0

HTTPModule?你能告訴我更多關於它嗎? – albertein 2008-10-15 22:38:56

+0

會在Global.asax上做Session_End嗎? – albertein 2008-10-15 22:46:04

+0

我會在Application.BeginRequest中global.asax HttpModules基本上是將global.asax編譯爲單獨的dll。適合模塊化 – FlySwat 2008-10-15 22:49:09

0

我將session和auth cookie超時值設置爲相同的值。我使用滑動窗口作爲我的授權cookie。我也習慣於永遠不要假設在嘗試使用它們之前,我從會話中獲得的值非空。我經常將所有會話功能抽象爲一個代理類,其中包含我在會話中存儲的值的強類型屬性。錯誤會話數據的錯誤處理在代理中進行了本地化。

0

在會話中存儲用戶信息將正常工作。要同步會話超時和授權Cookie超時,只需編輯您的web.config:

<sessionState timeout="XX" /> 
<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" timeout="XX" /> 
</authentication> 

這兩個值都是以分鐘爲單位。

測試null每次從Session獲得一個值!

相關問題