2011-02-08 29 views
37

Vì vậy, có rất nhiều bài viết trên StackOverflow liên quan đến điều này, nhưng tôi vẫn không thể giải quyết vấn đề chính xác của tôi. Đây là gist:Cookie Confusion với FormsAuthentication.SetAuthCookie() Phương pháp

Tôi có trang web yêu cầu xác thực. Tôi đang sử dụng phương thức .NET FormsAuthentication.SetAuthCookie() chuẩn để duy trì phiên của người dùng.

Câu hỏi của tôi là: Trong tệp web.config, có thuộc tính hết thời gian chờ cho nút "/system.web/authentication/forms". Nếu tôi đặt giá trị này để nói, 30 phút, đây có phải là thời điểm người dùng không hoạt động mà người dùng có thể có trước khi phiên của họ hết hạn không?

Lý do tôi hỏi là bất kể tôi đặt giá trị này là gì, nếu tôi đặt kiên trì thành true trong SetAuthCookie(), thời gian hết hạn trên tập hợp cookie là 90 phút. Nếu tôi đặt kiên trì thành sai trong SetAuthCookie(), hết hạn cookie được đặt thành "kết thúc phiên".

Giá trị thuộc tính "Thời gian chờ" thực sự thiết lập là gì và làm cách nào để nhận cookie cố định kéo dài một tháng hoặc một năm trở lên?

Trả lời

44

Thời gian chờ tham số bạn đã tìm thấy trong /system.web/authentication/forms là thời gian chờ (tính bằng phút) trong thời gian của vé xác thực.

Điều này có nghĩa là sau một khoảng thời gian không hoạt động nhất định, người dùng được nhắc đăng nhập lại. Nếu bạn cố gắng kiểm tra điều này My.Profile.Current.IsAuthenticated, nó sẽ là false.

Bạn có thể chọn không duy trì cookie. Trong trường hợp này nếu vé của bạn hết hạn, cookie của bạn cũng hết hạn. Cookie (trong trường hợp được duy trì) có mục đích ghi nhớ người dùng nếu họ quay lại trang web của bạn.

Bạn có thể muốn duy trì cookie của mình trong 10 năm để người dùng sẽ không bao giờ phải chèn tên người dùng và mật khẩu nữa, trừ khi họ đã chọn xóa cookie. Cookie có giá trị ngay cả khi trình duyệt được đóng (khi nó được duy trì).

Một điều quan trọng cần nhớ là tham số SlidingExpiration:

<authentication mode="Forms"> 
    <forms loginUrl="~/Partner/LogOn" defaultUrl="~/Home/Index" 
      timeout="30" slidingExpiration="true" /> 
</authentication> 

nếu đó là sự thật vé xác thực của bạn sẽ được gia hạn mỗi lần có hoạt động trên trang web của bạn: làm mới trang, vv

gì bạn có thể làm - và những gì tôi đã thực hiện - là để ghi cookie của riêng bạn như thế này:

FormsAuthenticationTicket authTicket = new 
    FormsAuthenticationTicket(1, //version 
    userName, // user name 
    DateTime.Now,    //creation 
    DateTime.Now.AddMinutes(30), //Expiration (you can set it to 1 month 
    true, //Persistent 
    userData); // additional informations 

cập nhật

Tôi đã thực hiện nguyên thói quen này, tôi muốn để lưu trữ các nhóm của tôi trong một cookie được mã hóa:

Dim authTicket As System.Web.Security.FormsAuthenticationTicket = _ 
     New System.Web.Security.FormsAuthenticationTicket(_ 
      1, _ 
      UserName, _ 
      Now, _ 
      Now.AddYears(100), _ 
      createPersistentCookie, _ 
      UserData) 

Dim encryptedTicket As String = System.Web.Security.FormsAuthentication.Encrypt(authTicket) 

Dim authCookie As HttpCookie = New HttpCookie(_ 
    System.Web.Security.FormsAuthentication.FormsCookieName, _ 
    encryptedTicket) 

If (createPersistentCookie) Then 
    authCookie.Expires = authTicket.Expiration 
End If 

Response.Cookies.Add(authCookie) 

Như bạn có thể thấy tôi đã thiết lập khi hết hạn của cookie xác thực và vé xác thực với cùng thời gian chờ (chỉ khi được duy trì).

Một điều khác mà tôi đã thử là lưu trữ tên người dùng và mật khẩu trong cookie được mã hóa. Mỗi lần trang chính được tải, tôi kiểm tra My.Profile.Current.IsAuthenticated để xem xác thực vẫn hợp lệ.Nếu tôi không đọc lại cookie, hãy lấy tên người dùng và mật khẩu và kiểm tra nó trên DB:

Public Function ReadCookieAuthentication(ByVal Context As System.Web.HttpContext) As Security.CookieAuth 

    Dim CookieUserData = New Security.CookieAuth() 

    Dim cookieName As String = System.Web.Security.FormsAuthentication.FormsCookieName 
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName) 

    If (Not (authCookie Is Nothing)) Then 
     Dim authTicket As System.Web.Security.FormsAuthenticationTicket = Nothing 
     Try 
      authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value) 
      If (Not (authTicket Is Nothing)) Then 
       If (authTicket.UserData IsNot Nothing) AndAlso Not String.IsNullOrEmpty(authTicket.UserData) Then 
        CookieUserData = New JavaScriptSerializer().Deserialize(Of Security.CookieAuth)(authTicket.UserData.ToString) 
       End If 
       CookieUserData.UserName = authTicket.Name 
      End If 
     Catch ex As Exception 
      ' Do nothing. 
     End Try 
    End If 

    Return (CookieUserData) 

End Function 

Security.CookieAuth là một đối tượng tôi đã tạo để trả về tên người dùng và mật khẩu.
CookieUserData là bộ nhớ (tôi lưu ở định dạng json) nơi tôi đặt mật khẩu và nhóm của mình.

+1

hi, xin lỗi, tôi biết điều này đã quá cũ nhưng chỉ tò mò, tại sao lưu trữ nó ở định dạng json? mật khẩu và nhóm. Tôi rất mới với mvc nên im vẫn cố gắng hiểu các khái niệm và thực hành tốt nhất trong việc phát triển với nó. cảm ơn! – gdubs

+3

@gdubs: Vâng, tôi biết. Đó là một chút khác thường. Tôi có thể đã chọn một định dạng khác nhưng tôi thích JSON. Cộng với MVC bạn có xu hướng sử dụng JSON khá nhiều nên tôi đã chấp nhận nó như một tiêu chuẩn. – LeftyX

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