2014-10-08 28 views
11

tôi có mã như thế này được điều hành khi một người dùng được ủy quyền:Cookie hết hạn hoặc thời gian chờ phiên quá sớm

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
       1, 
       email, 
       DateTime.Now, 
       DateTime.Now.AddMinutes(120), 
       true, 
       userData); 

     string encTicket = FormsAuthentication.Encrypt(authTicket); 
     HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
     faCookie.Expires = authTicket.Expiration; 
     Response.Cookies.Add(faCookie); 

sau đó tôi chuyển hướng đến một bộ điều khiển/Hành động đó có thuộc tính Authrize:

[Authorize] 
    public class ProductsController : Controller 
    { 

tôi đã sau trong web.config:

<authentication mode="Forms"> 
     <forms loginUrl="~/Home/Unauthorized" timeout="2880" /> 
    </authentication> 
    <sessionState timeout="120"></sessionState> 

Tuy nhiên người dùng phàn nàn về phiên thời gian ra hoặc tái chỉ đạo Trang chủ/Không được phép sau một vài phút không hoạt động.

điều gì có thể gây ra vấn đề này, tôi nên kiểm tra những gì khác?

+0

Tôi không hiểu tại sao mọi người bị nhầm lẫn với thời gian chờ cookie xác thực Mẫu và thời gian chờ của phiên máy chủ .. họ là 2 người khác nhau ... mate – Shaz

+0

bạn đang nói với máy chủ của mình hết hạn trong 120 phút và trên Mặt khác nói cookie trình duyệt để giữ vé xác thực cho 2280 ... rõ ràng là vé bị hết hạn sau 120 và người dùng bị hết thời gian chờ ... trong khi người dùng vẫn giữ vé xác thực trước .. – Shaz

+0

Bạn đã xác định rõ ràng 'MachineKey' trong web của mình. config? – Tommy

Trả lời

16

Một vài suy nghĩ trước khi tôi đi vào giải pháp có thể có tại sao thông tin đăng nhập của bạn hết hạn. Đầu tiên, cookie FormsAuthentication và SessionState hoàn toàn khác nhau. Bạn có thể có một hoặc khác, hoặc cả hai hoặc không. Kết quả là, thời gian chờ cho hai mục này cũng không liên quan.

Cookie FormsAuthentication là cookie được mã hóa có chứa một số thông tin cơ bản như tên người dùng và giá trị hết hạn. Ứng dụng .NET sử dụng cookie này khi người dùng đã xác thực để biết liệu người dùng có được cấp quyền cho một số tài nguyên nhất định hay không.

Điều gì kiểm soát việc mã hóa và giải mã cookie FormsAuthentication là MachineKey cho ứng dụng web đó trên IIS. MachineKey là một bộ khóa được sử dụng để mã hóa và giải mã cookie. Theo mặc định, một ứng dụng web trên IIS được đặt thành Tự động tạo khóa máy. Điều này có nghĩa là khi một ứng dụng khởi động, một khóa máy ngẫu nhiên được tạo ra. Nếu một ứng dụng tái chế, bạn sẽ nhận được một khóa máy mới. Ngoài ra, nếu bạn đang lưu trữ trên một nhà cung cấp chia sẻ, máy chủ lưu trữ web thường sẽ cân bằng tải ứng dụng của bạn, có nghĩa là được lưu trữ bởi nhiều máy chủ. Mỗi một trong các máy chủ đó sẽ tự động tạo ra một khóa máy.

Nếu ứng dụng web của bạn ở trong tình huống cân bằng tải, thì mỗi máy trong trang trại web không thể giải mã cookie được mã hóa của người khác. Điều này sẽ cung cấp cho sự xuất hiện của "đang được đăng xuất". Ví dụ về việc này là đăng nhập vào máy chủ web A, sau đó một yêu cầu tiếp theo đến máy chủ web B. Máy chủ web B không chia sẻ khóa máy với máy chủ web A và không thể giải mã cookie, đưa người dùng trở lại trang đăng nhập.

Giải pháp là xác định phần MachineKey trong web.config của bạn để mỗi cá thể của IIS sẽ sử dụng cùng một khóa cũng như nếu nhóm ứng dụng tái chế, bạn vẫn có cùng một khóa máy.

Dưới đây sẽ là một example machine key rằng bạn có thể đặt trong web.config của bạn

<system.web> 
    <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" 
    decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" 
    validation="SHA1" decryption="AES" /> 
</system.web> 

suy nghĩ khác là rằng hết hạn trong web.config của bạn (2880) và những gì bạn đang thực sự thiết lập khi hết thời hạn để được (120) không khớp. Bạn có thể muốn cả hai để phù hợp.

+1

giải thích tốt –

0

Nếu bạn đang chạy phía sau bộ cân bằng tải, bạn sẽ muốn đảm bảo rằng trang trại đang sử dụng khóa nhất quán như được chỉ ra bởi câu trả lời của Tommy.

Những thứ khác cần kiểm tra sẽ là việc giải quyết metabase IIS cho mỗi máy chủ giống hệt nhau. Họ cần phải có cùng một con đường và ID.

Bạn cũng sẽ muốn xem phiên giữ trên proc (web của bạn.config trông giống như trong proc) dễ bị mất mạng và tái chế ứng dụng ngẫu nhiên.

Về cơ bản, bản tóm tắt của liên kết này. http://msdn.microsoft.com/en-us/library/vstudio/ms178586(v=vs.100).aspx

Nếu bạn có thể đăng thêm cấu hình của mình nếu có thể và cung cấp thêm chi tiết về thiết lập môi trường, bạn sẽ dễ dàng hướng bạn theo hướng tập trung hơn.

0

Thử này một: Mã

web.config:

<system.web> 
     <httpRuntime maxRequestLength="40000000" useFullyQualifiedRedirectUrl="true" executionTimeout="600000" /> 
     <authentication mode="Forms"> 
       <forms loginUrl="~/Home/Unauthorized" timeout="2880" cookieless="UseCookies" /> 
      </authentication>  
    </system.web> 

này sẽ giúp bạn.

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