2014-09-16 17 views
5

Trang web của tôi sử dụng ASP.Net MVC 5.2.2 và ASP.Net Identity 2.1.0. Trong CookieAuthenticationOptions tôi đặt ExpireTimeSpan thành 30 phút và khoảng thời gian xác nhận tem bảo mật được đặt thành 2 phút (để người dùng sẽ được khởi động trong vòng hai phút sau khi gọi tới UserManager.UpdateSecurityStampAsync.Đăng ký ASP.NET Identity không thành công nếu không hoạt động lâu hơn khoảng xác thực tem bảo mật

Vấn đề là nếu người dùng vẫn còn nhàn rỗi trong thời gian dài hơn 2 phút và sau đó nhấp vào nút Sign Out, trang web không đăng xuất được. Sau một chút, tôi thấy rằng trong trường hợp này máy chủ trả về một cookie ứng dụng mới (cookie được gửi đến máy chủ là Điều gì dường như đang xảy ra là mã owin bỏ lỡ cuộc gọi đến AuthenticationManager.SignOut và tiếp tục với việc tạo ra một cookie ứng dụng mới, như nó thường có trong các trường hợp cũ hơn hai phút tuổi.

Có ai khác đã gặp sự cố này không? Bất kỳ đề xuất nào về cách chẩn đoán và khắc phục?

Tôi đang sử dụng Bản cập nhật VS 2013 3, nhưng vấn đề này tồn tại với các phiên bản trước của Identity.

UPDATE:

Là một thử nghiệm, tôi đã tạo ra một dự án ứng dụng ASP.NET Web thương hiệu mới với VS 2013 Cập nhật 3 mẫu và nhận thấy các vấn đề chính xác cùng: Tôi đăng nhập và sau đó chờ đợi một khoảng thời gian bằng với validateInterval của tem bảo mật (theo mặc định, 30 phút). Sau đó, tôi nhấp vào liên kết Đăng xuất và nhận thấy rằng, giống như trong dự án của riêng tôi, a) Tôi đã không đăng xuất và b) một cookie tem bảo mật mới đã được phát hành cho tôi. Tôi phải nhấp vào liên kết lần thứ hai để đăng xuất. Trong thực tế, tôi thậm chí không cần phải ngồi nhàn rỗi trong 30 phút: tôi có thể tiếp tục yêu cầu trong khoảng thời gian đó và nhấp vào nút đăng xuất sẽ vẫn không thành công, miễn là đó là yêu cầu đầu tiên sau khoảng thời gian 30 phút đã hết hạn.

Điều này có vẻ là một lỗi trong mã nhận dạng OWIN. Về cơ bản, nếu yêu cầu đầu tiên sau khoảng thời gian xác nhận là yêu cầu đăng xuất, nó không thành công, vì mã xác nhận và phát hành một tem bảo mật mới không kiểm tra xem người dùng đã đăng xuất như một phần của cùng một yêu cầu hay chưa. Các yêu cầu đăng xuất sẽ không thành công, miễn là chúng là một phần của yêu cầu có thể gây ra việc đóng lại tem bảo mật - tức là yêu cầu đầu tiên sau khi xác nhận biên bảnInterval kể từ khi phát hành tem bảo mật trước đó.

Tôi sẽ đánh giá cao nếu ai đó có thể xác nhận hành vi này. Bạn không phải đợi 30 phút và không phải tạo một dự án mới. Chỉ cần thực hiện dự án hiện có sử dụng Identity, tạm thời đặt khoảng thời gian xác thực thành một cái gì đó thực sự ngắn (30 giây hoặc một phút), đăng nhập và đảm bảo yêu cầu đầu tiên sau khi khoảng thời gian hết hạn là một lần nhấp vào nút Đăng xuất. Nếu đây là lỗi, bạn nên lưu ý rằng bạn vẫn đang đăng nhập.

Trả lời

5

Tôi cũng gặp phải sự cố tương tự. tôi giải quyết vấn đề bằng cách thay đổi AuthenticationManager.SignOut tôi để xác định một kiểu xác thực như sau:

AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie); 

Ngoài ra, các thành phần OWIN của bạn nên được trên phiên bản 3.0.0 (Mà phải là trường hợp, kể từ khi bạn đang sử dụng Bản sắc 2.1.0)

+0

Đây chính xác là những gì tôi đã phát hiện ra vài tháng trước. Nó có vẻ là một lỗi trong các thành phần nhận dạng. Tôi đã đăng bản sửa lỗi (giống với giải pháp này) trên trang Katana Codeplex (https://katanaproject.codeplex.com/workitem/356), nhưng quên cập nhật diễn đàn này. Chấp nhận câu trả lời của bạn. – Pando

+0

Tôi rất vui vì bạn đã hiểu đúng! Nó đã khiến tôi gãi đầu vài tháng trước. Tôi đã phải làm khá nhiều đọc trước khi một bài viết trên đây dẫn tôi đến các loại xác thực mặc định. Tôi đã nghĩ thử nó và nó đã hoạt động! : P – WJK

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