2012-01-24 23 views
15

Tôi đang sử dụng FormsAuthentication, tôi đang gặp sự cố khi đặt giá trị TimeOut.Hết thời gian chờ không hoạt động trong ASP.Net MVC FormsAuthentication

Tôi đã nhìn thấy một số bài đăng khác liên quan đến vấn đề này, nhưng dường như chúng không phải là vấn đề chính xác của tôi hoặc giải pháp được đề xuất không hữu ích.

web.config của tôi có như sau:

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

Tôi đã đặt một AuthorizeAttribute trên bộ điều khiển mà tôi muốn đảm bảo.

Tôi có thể xem cookie .ASPXAUTH (sử dụng FireCookies) và tôi có thể thấy rằng nó được đặt hết hạn sau 1 phút sau khi đăng nhập.

Nếu tôi gỡ lỗi thông qua mã của tôi, tôi có thể thấy rằng FormsAuthentication.Timeout = 1.

Tuy nhiên vé của tôi dường như không để thời gian chờ trong 1 phút. Sau 1 phút không hoạt động, tôi vẫn có thể duyệt đến bộ điều khiển với AuthorizeAttribute.

Thực tế tôi có thể xóa cookie .ASPXAUTH bằng FireCookies và tôi vẫn có thể duyệt đến bộ điều khiển bằng AuthorizeAttribute.

Kỳ lạ sau khi không hoạt động trong một thời gian dài (xin lỗi không có thời gian chính xác - tôi đã ra ngoài ăn trưa!) TimeOut xảy ra và tôi được chuyển hướng tới màn hình đăng nhập.

Bất kỳ ý tưởng nào?

Trả lời

0

Đó là khoảng thời gian chờ của phiên của bạn. Mặc định là 20 phút và bạn có thể thay đổi nó trong web.config như sau:

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

Nhưng trạng thái phiên tách biệt với cookie AuthenticTicket/.ASPXAUTH. Ít nhất tôi nghĩ nó là ?! – bplus

+0

nếu bạn không sử dụng cookie để lưu trữ dữ liệu này, thì phiên có trách nhiệm chăm sóc nó. –

+0

Nhưng tôi đang sử dụng cookie! Tôi đã có cookieless = "UseCookies". Cảm ơn vì đã phản hồi. Tôi thực sự bối rối bởi điều này - đề xuất của bạn hoạt động nhưng tôi không biết tại sao? – bplus

10

Tôi cũng gặp vấn đề tương tự. Trên thực tế, nó đến vì tôi không thể đọc cookie xác thực biểu mẫu từ javascript, nó được sau một thời gian undefined. Tôi chỉ muốn biết nếu tôi đã được xác thực thông qua javascript.

Sau đó, tôi thấy rằng vé đã hết hạn, nhưng tôi đã không bị đăng xuất (cũng vì vậy tôi cũng muốn giải quyết điều đó)! Tôi thấy câu hỏi của bạn đã không được trả lời vì vậy tôi giữ nó mở trong khi tôi làm việc ra vấn đề của tôi trong nửa ngày. Sau đây là những gì tôi nghĩ ra có vẻ như đang hoạt động.

Câu trả lời của tôi dựa trên câu trả lời này. https://stackoverflow.com/a/454639/511438 bởi người dùng ScottS

Đây là dự án ASP.NET MVC 3 của tôi.

Đây là mã đăng nhập của tôi. Không được hiển thị, logic xác thực người dùng tùy chỉnh trước đó. Điều này chỉ đặt vé ban đầu.

public class 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); 
} 

trong cùng một lớp nhưng một phương pháp tĩnh được truy cập từ 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; 

} 

toàn cầu.asax

Tùy chỉnh của tôi cho rằng yêu cầu ajax không làm mới vé xác thực biểu mẫu. Vì vậy, nếu bạn ngồi ở đó trong khoảng thời gian chờ, yêu cầu ajax sẽ đăng xuất bạn. Thay đổi điều đó nếu bạn muốn yêu cầu ajax để giữ vé còn sống (giải quyết vấn đề cookie javascript của tôi, không phải vấn đề không hoạt động đăng xuất của bạn). * (mẹo, nếu bạn đăng xuất, sau đó đăng nhập, nhưng trở lại trang đăng nhập lần nữa, lần đăng nhập đầu tiên không chỉ định returnUrl trong chuỗi truy vấn có thể). *

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 đây là phần mà tôi đặt thời gian chờ phiên và thời gian chờ vé

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

tôi đã thấy mã của bạn RefreshLoginCookie() chức năng này tạo ra cookie auth với dữ liệu cũ nhưng tại sao chỉ không thể hiểu được. trong tình huống nào mọi người sẽ đi theo cách tiếp cận này? – Mou

0

Một giải pháp rõ ràng mà có thể dễ dàng được nhìn qua bởi một số người, xóa cookie của trình duyệt hoặc đăng xuất nên giải quyết vấn đề. Nếu nhớ tôi đã được kiểm tra, ứng dụng sẽ tiếp tục đăng nhập bằng cookie cũ bất kể những thay đổi được thực hiện với giá trị timeout Web.Config.

Các vấn đề liên quan