2009-09-24 6 views
56

Trong trang web asp.net của tôi đang sử dụng xác thực hình thức asp.net với cấu hình sau câu hỏihình thức xác thực Timeout vs phiên Timeout

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/Common/Login.aspx" 
      defaultUrl="~/Pages/index.aspx" 
      protection="All" 
      timeout="30" 
      name="MyAuthCookie" 
      path="/" 
      requireSSL="false" 
      cookieless="UseDeviceProfile" 
      enableCrossAppRedirects="false" > 
    </forms> 
</authentication> 

Tôi đã sau

  1. gì nên được timeout value for phiên vì tôi đang sử dụng hết hạn trượt bên trong hình thức xác thực do phiên sẽ hết hạn trước khi xác thực biểu mẫu. Làm thế nào tôi có thể bảo vệ nó?

  2. Sau khi xác thực forma đăng xuất, tôi muốn chuyển hướng trang tại logout.aspx nhưng nó tự động chuyển hướng tôi tại loginpage.aspx. Làm thế nào là nó có thể?

Trả lời

47
  1. Để được ở bên an toàn: TimeOut (Session) < = TimeOut (FormsAuthentication) * 2
  2. Nếu bạn muốn hiển thị trang khác ngoài quy định tại loginUrl thuộc tính sau thời gian chờ xác thực bạn cần phải xử lý điều này bằng tay như ASP.NET không cung cấp một cách để làm điều đó.

Để đạt đượC# 2, bạn có thể kiểm tra cookie theo cách thủ công và AuthenticationTicket của nó để hết hạn và chuyển hướng đến trang tùy chỉnh của bạn nếu chúng hết hạn.
Bạn có thể thực hiện trong một trong các sự kiện: AcquireRequestState, AuthenticateRequest.

Mẫu mã trong trường hợp có thể trông giống như:

// Retrieve AuthenticationCookie 
var cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
if (cookie == null) return; 
FormsAuthenticationTicket ticket = null; 
try { 
    ticket = FormsAuthentication.Decrypt(cookie.Value); 
} catch (Exception decryptError) { 
    // Handle properly 
} 
if (ticket == null) return; // Not authorised 
if (ticket.Expiration > DateTime.Now) { 
    Response.Redirect("SessionExpiredPage.aspx"); // Or do other stuff here 
} 
+2

Cảm ơn Dmitriy, Câu hỏi thứ hai của tôi: Như được viết ở trên bên trong

trang mặc định đó là "index.aspx" và đăng nhập là "login.aspx". Sau khi đăng nhập vào trang bảng điều khiển của tôi khi tôi vẫn lý tưởng trong 30 phút (thời gian chờ) và sau đó tôi nhấp vào bất kỳ liên kết nào tôi sẽ tự động chuyển hướng đến trang đăng nhập bằng URL sau http: // localhost: /virtualdir/Pages/Login.aspx? ReturnUrl =% 2fvirtualdir% 2fPages% 2fDashBoard.aspx Nhưng ở đây tôi muốn chuyển hướng trang tại trang đăng xuất nơi tôi có thể nói một số thông tin đăng xuất –

+0

Đã cập nhật câu trả lời. –

+0

Bạn có thể chỉ cho tôi ví dụ vì trong trường hợp của tôi tôi lấy kịch bản mà tôi đặt timeauthentication timeout = 2 phút trong khi timeout phiên = 6 phút và sau 3 phút khi tôi nhấp vào liên kết Không gỡ lỗi ở bất cứ đâu ngay cả "AcquireRequestState" Hãy giúp tôi? –

24

Đối với các trang web có một sự phụ thuộc phiên, bạn chỉ có thể đăng xuất của một xác thực cũ với sự kiện phiên khởi đầu trong global.asax:

void Session_Start(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Request.IsAuthenticated) 
    { 

    //old authentication, kill it 
    FormsAuthentication.SignOut(); 
    //or use Response.Redirect to go to a different page 
    FormsAuthentication.RedirectToLoginPage("Session=Expired"); 
    HttpContext.Current.Response.End(); 
    } 

} 

Điều này khiến cho phiên mới này = xác thực mới, thời gian.

+1

Có vẻ như rất mạnh, nhưng là một lựa chọn tốt cho chúng tôi khi có phiên họp tại chỗ là điều cần thiết vào lúc này. –

+3

Tôi không chắc tôi sẽ gọi nó là mạnh mẽ. Nó chỉ đơn giản là kết hôn với các trạng thái xác thực phiên với nhau. Chắc chắn, một tùy chọn mạnh mẽ hơn sẽ là khôi phục phiên cho mã thông báo xác thực. Nhưng nếu khôi phục phiên là một suy nghĩ (tức là lan rộng khắp nơi), giải pháp đơn giản nhất là đưa người dùng trở lại trên một con đường đã biết (đăng nhập). –

+0

Đúng, đây là tuyến đường chúng tôi đã thực hiện cho đến khi chúng tôi có thể thực hiện các phiên tái tạo trên đường bay. –