2011-03-11 37 views
6

我正在使用ASP.NET登錄控件。我希望能夠爲每個用戶單獨設置表單身份驗證超時(而不是全局在web.config中)。根據我的理解,唯一的方法是手動設置AuthenticationTicket的超時時間。使用登錄控制時有沒有辦法做到這一點?在我看來,登錄控制將所有這一切都抽象出來。我希望有一些方法可以繼續使用登錄控制,但也可以爲每個用戶分別設置FormsAuthentication超時。使用ASP.NET登錄控件時可以手動設置身份驗證票嗎?

感謝, 科瑞

回答

7

MSDN says

的的loggedIn事件的 身份驗證提供者檢查後提出 用戶的憑證和 認證cookie排隊, 發送給瀏覽器,在接下來的 響應中。在對 用戶進行身份驗證後,使用登錄事件 可提供其他處理,例如 訪問每個用戶的數據。

所以這個事件似乎是取代cookie的正確地方。首先,餅乾需要進行檢索和解密:

在此之後
HttpCookie authCookie = Response.Cookies[FormsAuthentication.FormsCookieName]; 
FormsAuthenticationTicket oldAuthTicket = 
    FormsAuthentication.Decrypt(authCookie.Value); 

權的基礎上,只提取新的認證憑證應創建:

FormsAuthenticationTicket newAuthTicket = new FormsAuthenticationTicket(
    oldAuthTicket.Version, 
    oldAuthTicket.Name, 
    DateTime.Now, 
    DateTime.Now.Add(timeoutForUser), 
    oldAuthTicket.IsPersistent, 
    oldAuthTicket.UserData, 
    FormsAuthentication.FormsCookiePath 
); 

timeoutForUser這裏是一個TimeSpan值保持會話超時爲用戶。

最後,舊Cookie的響應應該用新的替換:

string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 
authCookie = 
    new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
HttpContext.Current.Response.Cookies.Set(authCookie); 

這應該做的伎倆。

+0

謝謝!這工作完美。你達人! – 2011-03-11 21:07:23

1

登錄控件有,你可以用它來處理自己的認證LoggingInLoggedIn事件。

您可以通過設置e.Cancel = True取消在LoggingIn事件的登錄過程,然後手動創建票證使用新new FormsAuthenticationTicket(...)