8

Tôi có mã bên dưới trên trang đăng nhập. Tôi đang sử dụng điều này để đặt thời gian chờ đăng nhập của khách hàng. Trong IE8, tôi đang gặp sự cố nếu người dùng mở cửa sổ trình duyệt khác, sau đó đăng xuất trong cửa sổ đầu tiên, khi họ truy cập lại, họ sẽ bị trả về đăng nhập sau một trang (mỗi lần). Nếu họ không mở trình duyệt khác, mọi thứ đều ổn.Cookie xác thực biểu mẫu IE8 & ASP.Net không thành công khi mở nhiều trình duyệt

Tôi đã tìm thấy ALOT câu hỏi về vấn đề này, nhưng giải pháp duy nhất tôi thấy rằng công trình là sử dụng phương pháp cookieless (URI).

Tôi đã xem một số bài viết nói rằng để đặt tên miền, mà tôi đang làm, nhưng điều đó không hiệu quả. Ngoài ra, tôi đã thử thiết lập authticket cho cả hai liên tục và không liên tục. Không có sự khác biệt. Tôi đã thấy rằng khi cookie auth biến mất khỏi thư mục, nó không được tạo lại khi tôi đăng nhập.

Nếu tôi mở cửa sổ trình duyệt thứ hai đó là "Phiên mới", tôi không gặp bất kỳ vấn đề gì. (Điều này là không thực tế vì chúng tôi không thể đào tạo mọi người dùng của ứng dụng để mở bất kỳ cửa sổ bổ sung nào theo cách này.)

Có khắc phục điều này mà bất kỳ ai đã phát hiện không liên quan đến cách tiếp cận URI không nấu ăn?

int timeoutValue = 20 // This value is actually returned from a method; 

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(LoginControl.UserName, false, timeoutValue);    
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);     
authCookie.Domain = "my.domain"; 
authCookie.Expires = DateTime.Now.AddMinutes(timeoutValue); 

HttpContext.Current.Response.Cookies.Add(authCookie); 
+0

làm rõ: người dùng mở cửa sổ trình duyệt mới từ ứng dụng? tức là nhấp chuột phải> mở liên kết trong cửa sổ mới, về cơ bản kéo dài phiên tới cửa sổ mới? –

+0

Có, nhưng không quan trọng cách họ mở cửa sổ thứ hai. Nếu họ bắt đầu trình duyệt mới từ lối tắt trên màn hình, tab mới, nhấp chuột phải. Cách duy nhất không gây ra sự cố là "Tệp ... Phiên mới" – Mikejh99

+0

Thực ra, hãy để tôi làm lại điều đó. Nếu tôi khởi động trình duyệt orignal từ một shortcut trên desktop, tôi không gặp vấn đề gì. Tôi nghĩ rằng điều này có liên quan đến cách IE khởi chạy, với -nomerge hoặc một cái gì đó tương tự. – Mikejh99

Trả lời

3

Đây là "tính năng" của Internet Explorer để chia sẻ cookie/phiên trên cửa sổ trình duyệt. Do đó, tính năng "mới" để tạo "Phiên mới" trong IE8. Vì vậy, tôi không tin rằng có bất kỳ cách lý tưởng nào để dễ dàng ngăn chặn hành vi này.

Khác với việc nấu nướng không cần thiết.

2

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã chiến đấu cùng một vấn đề này và tôi tin rằng tôi có một sửa chữa. Tôi đã nhân rộng các triệu chứng chính xác này và cũng có thể loại bỏ chúng thành công (ít nhất là cho đến nay).

Chỉ đặt hết hạn trên cookie nếu bạn muốn có vé xác thực liên tục loại bỏ vấn đề đối với tôi.

Đây là phương pháp của tôi như bây giờ đứng:

internal static void CreateAuthenticationCookie(string userName, bool rememberMe, bool expired = false) 
{ 
    int timeout = expired ? -1440 : (rememberMe ? 43200 : 20); // Timeout in minutes, 525600 = 365 days, 1440 = 1 day. 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(timeout), rememberMe, string.Empty); 
    string encrypted = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted); 

    if (rememberMe) 
     cookie.Expires = System.DateTime.Now.AddMinutes(timeout); 

    HttpContext.Current.Response.Cookies.Add(cookie); 
} 

Và đây là cách tôi gọi nó là:

if(createPersistentCookie) 
    CreateAuthenticationCookie(userName, createPersistentCookie); 
else 
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

Tôi nhận ra rằng bằng cách này tôi đang gọi nó, không có nhu cầu cho tham số "nhớ tôi" trên phương thức CreateAuthenticationCookie (vì tôi luôn chuyển đúng trong trường hợp đó), nhưng tôi chưa tái cấu trúc nó và nó thể hiện rõ hơn cách người khác có thể muốn sử dụng nó.

Tôi muốn một cách dễ dàng có thời hạn trượt nếu người dùng chọn không "nhớ tôi", nhưng nếu họ chọn "nhớ tôi" tôi không muốn bị hạn chế trong thời gian chờ 30 phút "nhớ tôi" người dùng. Mục đích của tôi là nếu ai đó đang sử dụng máy tính công cộng, họ sẽ bị trượt hết hạn và không nhớ tôi, nhưng nếu họ đang sử dụng máy tính cá nhân thì họ có thể "nhớ tôi" và không bị ràng buộc bởi cài đặt timeout trong web.config. Không biết rằng tất cả điều này áp dụng cho tình huống của bạn, nhưng tôi hy vọng nó sẽ giúp một người nào đó hoặc phương pháp luận của tôi có thể rút ra một số lời chỉ trích mang tính xây dựng để tôi có thể điều chỉnh nếu cần.

PS. Đây là trang web của tôi.cài đặt cấu hình để xác thực biểu mẫu:

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="30" slidingExpiration="true"/> 
</authentication> 
Các vấn đề liên quan