2015-11-10 17 views
9

Tôi có một trang web tương đối đơn giản WebForms dựa trên sử dụng Forms Authentication:Ngăn chặn FormsAuthentication thời gian hết hạn từ tăng

<authentication mode="Forms"> 
    <forms loginUrl="login.aspx" defaultUrl="secure/home.aspx" name=".AdminSite" /> 
</authentication> 

Như nó không được đề cập một cách rõ ràng, slidingExpiration được thiết lập là true theo mặc định, và do đó người dùng không được đăng nhập miễn là họ vẫn đang điều hướng xung quanh trang web.

Tuy nhiên, tôi muốn một trang cụ thể để không tăng thời gian hết hạn. Điều này có thể, hoặc trong phạm vi web.config hoặc trong mã? Các đề xuất duy nhất tôi đã thấy đề cập đến việc thiết lập slidingExpiration thành false, sẽ áp dụng trên toàn bộ mặt.

Các cookie xác thực được thiết lập sử dụng:

FormsAuthentication.RedirectFromLoginPage(username, False) 

và do đó làm thay đổi cookie xác thực chính nó là không thực tế.

Trả lời

3

Mô-đun FormsAuthentication đạt được hết hạn trượt bằng cách cấp lại cookie khi cần thiết. Để ngăn chặn việc trượt, bạn cần phải ngăn chặn việc gia hạn cookie xảy ra.

Điều này có thể được thực hiện bằng cách xóa cookie FormsAuthentication khỏi phản hồi.

Dưới đây là mã phía sau từ một biểu mẫu web rất đơn giản. Trang aspx có một số div hiển thị kết quả từ sự kiện Page_Load.

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     testDiv.InnerHtml = "Hi, cookie is: " + HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value; 
     testDiv.InnerHtml += "<br />"; 
     var ticket = FormsAuthentication.Decrypt(HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value); 
     testDiv.InnerHtml += "Expires: " + ticket.Expiration.ToString("yyyy-MM-dd HH:mm:ss"); 

     if(Response.Cookies.AllKeys.Contains(FormsAuthentication.FormsCookieName)) 
      testDiv.InnerHtml += "<br />Forms auth is trying to update the cookie in this response"; 

    } 
    protected void Page_Prerender(object sender, EventArgs e) 
    { 
     if (Response.Cookies.AllKeys.Contains(FormsAuthentication.FormsCookieName)) 
      Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
    } 
} 

Sự kiện Page_Prerender loại bỏ các FormsAuthentication cookie từ các phản ứng nếu nó hiện nay, do đó ngăn ngừa sự trượt.

Tôi đã thử nghiệm điều này bằng cách đặt thời gian chờ cho FormsAuthentication thành hai phút. Sau đó, tôi bắt đầu gỡ lỗi và đăng nhập. Sau đó, tôi tiếp tục làm mới trang được đề cập.

FormsAuthentication không cập nhật cookie trừ khi một nửa thời gian hết hạn, điều xảy ra là trong phút đầu tiên, trang sẽ tiếp tục hiển thị cùng một cookie được mã hóa và cùng thời gian hết hạn. Sau hơn một phút, trang sẽ báo cáo rằng FormsAuthentication đang cố gắng gia hạn cookie. Nhưng Page_Prerender xóa cookie để nó không được gửi đi. Sau một phút nữa, bạn sẽ được chuyển hướng đến trang đăng nhập.

Kiểm tra tương tự nhưng xóa phương thức Page_Prerender cho thấy rằng cookie được thay đổi và thời gian hết hạn được cập nhật sau khoảng một phút.

+0

Đó là một cách thú vị và khá nhỏ gọn - tôi sẽ thử. –

+0

Hoạt động tốt và rất đơn giản để triển khai. Cảm ơn. –

0

Bạn có thể đặt ngày hết hạn của cookie phản hồi cho ngày hết hạn của cookie yêu cầu, ghi đè hiệu quả những gì hệ thống đang làm cho trang cụ thể đó.

+0

Thật không may, cookie dựa trên phiên chứ không phải là liên tục và kết quả là không có tập hợp hết hạn. –

0

Sau khi suy nghĩ, tôi đã lệch khỏi việc cố gắng thay đổi cookie hoặc tạo cookie thứ hai hoặc ghi đè cookie bằng cách thay đổi Session.Timeout. Tôi nghĩ rằng nó thực sự có thể được dễ dàng hơn để sử dụng một bộ đếm thời gian, bằng cách sử dụng System.Timers. Các phương pháp cho bộ đếm thời gian luôn có thể được đưa vào một lớp riêng biệt nếu bạn muốn.

using System.Timers; 



public partial class MyPage:Page 
{ 

    private System.Timers.Timer timer; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     SetTimer(); 
    } 
    private void SetTimer() 
    { 
     // Interval is set in milliseconds- set as you please. 
     timer = new System.Timers.Timer(1000 * 60); 

     timer.Elapsed += OnTimedEvent; 
     timer.AutoReset = true; 
     timer.Enabled = true; 
    } 

    // In this handler, stop the timer and call a method to clear all cookies. 
    private void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     timer.Stop(); 
     ClearAllCookies(); 
    } 

    // Method to clear all cookies. There may be a simpler way to do this, you are vague about your cookies, so I supplied a clear all. 

    public void ClearAllCookies() 
    { 
     HttpCookie cookie; 
     string cookieName; 
     int cookieCnt = Request.Cookies.Count; 
     for(int i = 0; i < cookieCnt; i++) 
     { 
      cookieName = Request.Cookies[i].Name; 
      cookie = new HttpCookie(cookieName); 
      // This causes the cookie to expire 
      cookie.Expires = DateTime.Now.AddDays(-1); 
      Response.Cookies.Add(cookie); 
     } 

     Response.Redirect("LogIn.aspx"); 
    } 
} 

Sửa

Hoặc sử dụng một phương pháp mà các bản ghi người sử dụng ra. Dù bằng cách nào, bạn sẽ kết thúc phiên mà không cần phải xác thực với xác thực của người dùng trong suốt thời gian còn lại của trang web, ngoại trừ kết thúc phiên nếu phiên đó hết thời gian trên trang cụ thể này.

public void ForceLogOff(){ 

    Session.Clear(); 
    Session.Abandon(); 
    Session.RemoveAll(); 

    // Do here whatever you need to do. 
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 

    Response.Redirect("LogIn.aspx"); 
} 

Cách bạn kết thúc phiên tùy thuộc vào bạn. Điều này cung cấp cho bạn một cách để ghi đè vấn đề hết hạn trượt và đặt thời gian chờ tùy chỉnh chỉ trong một trang.

+0

Tôi đã làm rõ trong câu hỏi về cách cookie xác thực được đặt; dựa trên phiên làm việc với số không hết hạn, vì vậy việc thay đổi thời gian hết hạn sẽ không hoạt động. –

+0

@AdrianWragg Sau đó, tạo phương thức xóa tất cả .. giải pháp này sẽ hoạt động. Ý tưởng là xóa tất cả cookie và đăng xuất người dùng .. nó có thể là chuyển hướng đến đăng xuất tự động. Và theo cách này, bạn không chạm vào cookie, trừ khi bạn muốn kết thúc phiên. –

+0

Tôi không chắc tại sao giải pháp của bạn là xóa cookie ra. Giải pháp của bạn dường như tương đương với việc chỉ cần đặt 'slidingExpiration' thành' false', đây không phải là vấn đề tôi đang cố gắng giải quyết - tôi chỉ muốn một trang duy nhất không kéo dài thời gian hết hạn khi được truy cập. –

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