2011-01-31 20 views
9

Tôi đang sử dụng xác thực mẫu ASP.NET để ghi nhật ký người dùng vào trang web mà chúng tôi đang phát triển.Nhớ chức năng của tôi trong ASP.NET Form Authentication không hoạt động

Một phần chức năng là hộp kiểm "Nhớ thông tin đăng nhập của tôi" ghi nhớ người dùng trong một tháng nếu họ kiểm tra.

Mã để đăng nhập người sử dụng trong thực hiện như sau:

public static void Login(HttpResponse response, string username, 
    bool rememberMeChecked) 
{ 
    FormsAuthentication.Initialize(); 
    FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username, DateTime.Now, 
    DateTime.Now.AddMinutes(30), rememberMeChecked, 
    FormsAuthentication.FormsCookiePath); 
    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(tkt)); 
    ck.Path = FormsAuthentication.FormsCookiePath; 

    if (rememberMe) 
    ck.Expires = DateTime.Now.AddMonths(1); 

    response.Cookies.Add(ck); 
} 

Các phần có liên quan trong web.config là thế này:

<authentication mode="Forms"> 
    <forms loginUrl="Home.aspx" defaultUrl="~/" slidingExpiration="true" timeout="43200" /> 
</authentication> 

này ghi lại tốt người dùng nhưng ghi chúng ra sau nửa giờ nếu họ không sử dụng trang web, mặc dù tài sản kiên trì của nó (rememberMeChecked) được đặt thành true và nếu đúng, cookie được đặt hết hạn sau một tháng. Có cái gì tôi đang thiếu ở đây?

Cảm ơn trước, F

+1

Tôi không chắc chắn nếu điều này sẽ tạo ra một sự khác biệt trong trường hợp này ở tất cả, tuy nhiên, có gì sai với việc sử dụng 'FormsAuthentication.RedirectFromLoginPage (userName, rememberMe)'? Có yêu cầu tự tạo vé không? Nếu bạn chỉ định thời gian chờ trong cấu hình thì bạn không cần phải viết thủ công trong mã, AFAIK. Ngoài ra, 'RememberMe' được đặt ở đâu? –

Trả lời

0

Có vẻ với tôi rằng bạn đang kiểm tra "Nhớ đến anh" chứ không phải là biến bạn trôi qua gọi là "rememberMeChecked".

1

Hãy thử thiết lập các thuộc tính Name của thẻ hình thức trong web.config của bạn

Ngoài ra, Firecookie là tuyệt vời tại gỡ lỗi những loại vấn đề

Chỉ cần đọc qua mã của bạn một lần nữa, bạn tôi cũng đã quy định DateTime.Now.AddMinutes(30) trong nhà xây dựng vé của bạn ... phải kiểm tra xem hiệu ứng đó có hiệu lực không

+0

Liên kết 'tên' bị hỏng. –

+1

@TravisJ cập nhật :) – davidsleeps

0

Bạn đã chỉ định DateTime.Now.AddMinutes(30) trong hàm tạo cho FormsAuthenticationTicket. Đây là những gì được thiết lập hết hạn cho đăng nhập.

6

Dường như vé xác thực của bạn vẫn được định cấu hình hết hạn sau nửa giờ, ngay cả khi bản thân cookie hết hạn sau 30 ngày. Bạn có thể phải kéo dài tuổi thọ của vé quá:

public static void Login(HttpResponse response, string username, 
    bool rememberMeChecked) 
{ 
    DateTime expiration = DateTime.Now.AddMinutes(30); 
    if (rememberMe) { 
     expiration = DateTime.Now.AddMonths(1); 
    } 

    FormsAuthentication.Initialize(); 
    FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username, 
     DateTime.Now, expiration, rememberMeChecked, 
     FormsAuthentication.FormsCookiePath); 

    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(tkt)); 
    ck.Path = FormsAuthentication.FormsCookiePath; 
    response.Cookies.Add(ck); 
} 
-1

Tôi nhận ra rằng vé xác thực phải được gia hạn, không chỉ đọc. Phương thức Application_BeginRequest của tôi trông giống như sau:

if (!Request.IsAuthenticated) 
    { 
    HttpCookie ck = Request.Cookies[FormsAuthentication.FormsCookieName]; 

    if (ck != null) 
    { 
     FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(ck.Value); 
     UserManagementUtils.RenewFormsAuthenticationTicket(Response, oldTicket); 
    } 
    } 

Điều đó dường như đã được xử lý.

+0

Điều này cần được thực hiện bởi khung. Tôi nghĩ rằng vấn đề như đã đề cập trong câu trả lời ở trên là bạn không đặt hết hạn vé chỉ là cookie. – Justin

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