2012-01-24 67 views
15

我使用FormsAuthentication,我有問題設置TimeOut值。超時不工作在ASP.Net MVC FormsAuthentication

我已經看到一些與此相關的其他帖子,但他們似乎並不完全是我的問題,或者解決方案建議不起作用。

我的web.config有以下幾點:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogOn" 
     timeout="1" 
     cookieless="UseCookies" /> 
</authentication> 

我已經把一個AuthorizeAttribute上,我要保護的控制器。

我可以查看.ASPXAUTH cookie(使用FireCookies),我可以看到它設置爲在登錄後1分鐘過期。

如果我通過我的代碼調試,我可以看到FormsAuthentication.Timeout = 1

但是我的票似乎並沒有在1分鐘內超時。不活動1分鐘後,我仍然可以使用AuthorizeAttribute瀏覽控制器。

事實上,我實際上可以使用FireCookies刪除.ASPXAUTH cookie,並且仍然可以使用AuthorizeAttribute瀏覽到控制器。

在長時間處於非活動狀態後很奇怪(抱歉,沒有確切的時間 - 我午餐時間外出),TimeOut發生,我將 重定向到登錄屏幕。

任何想法?

回答

0

這是關於您的會話超時多長時間。默認值是20分鐘,你可以這樣改變它在web.config中:

<sessionState mode="InProc" timeout="20"/> 
+2

但會話狀態與AuthenticationTicket/.ASPXAUTH cookie分開。至少我認爲這是?! – bplus

+0

如果你不使用cookies來存儲這些數據,那麼會話負責處理它。 –

+0

但我正在使用cookies!我有Cookieless =「UseCookies」。感謝您的迴應。我真的很困惑 - 你的建議可行,但我不知道爲什麼? – bplus

10

我也有同樣的問題。其實,它是因爲我無法從javascript讀取表單身份驗證cookie,這是過了一段時間undefined。我只是想知道我是否通過JavaScript進行身份驗證。

後來我發現票已過期,但我沒有註銷(也是,所以我想解決這個問題)!我看到你的問題沒有得到答覆,所以我在半天內解決問題時保持開放。以下是我想到的,似乎正在工作。

我的答案是基於這個答案。 https://stackoverflow.com/a/454639/511438由用戶ScottS

這是在我的ASP.NET MVC 3項目。

這是我的登錄代碼。未顯示,它之前的自定義用戶身份驗證邏輯。這只是設置最初的票。

公共類FormsAuthenticationService:IFormsAuthentication

public void SignIn(string userName, bool createPersistentCookie, string role) 
{ 
    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
      1,        // version 
      userName,   // user name 
      DateTime.Now,     // created 
      DateTime.Now.Add(FormsAuthentication.Timeout), // expires 
      false,     // rememberMe? 
      role      // can be used to store roles 
      ); 

    string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
    HttpContext.Current.Response.Cookies.Add(authCookie); 
} 

在同一類,但一個靜態方法是從Global.asax的

//-- this is based on https://stackoverflow.com/questions/454616/asp-net-cookies-authentication-and-session-timeouts 
internal static FormsAuthenticationTicket RefreshLoginCookie(bool retainCurrentExpiry) 
{ 
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie == null || authCookie.Value == null) 
     return null; 

    FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value); 

    DateTime expiryDate = (retainCurrentExpiry ? oldTicket.Expiration : DateTime.Now.Add(FormsAuthentication.Timeout)); 
    HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 

    var newTicket = new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, expiryDate, 
     oldTicket.IsPersistent, oldTicket.UserData, oldTicket.CookiePath); 

    HttpCookie newAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newTicket)); 
    HttpContext.Current.Response.Cookies.Add(newAuthCookie); 

    return newTicket; 

} 

全球訪問。asax

我的自定義來自於ajax請求不刷新表單身份驗證票證。所以如果你在那裏等待超時,ajax請求會將你註銷。如果你想讓Ajax請求保持活着(改變我的javascript cookie問題,而不是你的註銷不活動的問題),改變這一點。 *(提示,如果你註銷,然後登錄,但又回到登錄頁面,第一次登錄沒有在查詢字符串中指定returnUrl)。 *

protected virtual void Application_AuthenticateRequest(Object sender, EventArgs e) 
{ 
    HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie == null || authCookie.Value == "") 
    { 
     return; 
    } 

    bool isAjax = new HttpRequestWrapper(System.Web.HttpContext.Current.Request).IsAjaxRequest(); 

    FormsAuthenticationTicket authTicket; 
    try 
    { 
     //-- THIS IS WHAT YOU WANT 
     authTicket = FormsAuthenticationService.RefreshLoginCookie(isAjax); 
    } 
    catch 
    { 
     return; 
    } 

    string[] roles = authTicket.UserData.Split(';'); 
    if (Context.User != null) Context.User = new GenericPrincipal(Context.User.Identity, roles); 

} 

的Web.config 這裏是我設置會話超時和票證超時部分

<configuration> 
    <system.web> 
     <sessionState mode="InProc" timeout="60" /> 
     <authentication mode="Forms"> 
      <forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" /> 
     </authentication> 
+0

我已經看到你的代碼RefreshLoginCookie()這個函數生成auth cookie與舊數據,但爲什麼只是不明白。人們會採取什麼樣的情況來採取這種方法? – Mou

0

一個顯而易見的解決方案,它可以很容易地被一些人來看着,清除瀏覽器Cookie或註銷應該解決問題。如果記住我被選中,應用程序將繼續使用舊的cookie登錄,而不管Web.Config超時值發生了什麼變化。