2010-05-23 28 views
9

Tôi đang thử nghiệm với FormsAuthentication (sử dụng ASP.NET MVC2) và nó đang hoạt động khá tốt.Vô hiệu hóa ASP.NET FormsMáy chủ xác thực bên

Tuy nhiên, một trường hợp tôi không thể tìm ra cách xử lý là xác thực danh tính người dùng trên máy chủ để đảm bảo nó vẫn hợp lệ từ góc nhìn của máy chủ .

ví dụ:

  1. người dùng đăng nhập ... nhận một cookie/vé
  2. Out of band người dùng sẽ bị xóa ở phía máy chủ
  3. tài tạo ra một yêu cầu mới đến máy chủ. HttpContext.User.Identity.Name được đặt thành người dùng đã bị xóa.

Tôi có thể phát hiện tiền phạt này, nhưng cách chính xác để xử lý nó là gì? Gọi FormsAuthentication.SignOut trong các sự kiện OnAuthorization trên OnActionExecuting quá muộn để ảnh hưởng đến yêu cầu hiện tại.

Hoặc tôi muốn có thể gọi FormsAuthentication.InvalidateUser (...) khi người dùng bị xóa (hoặc cơ sở dữ liệu được tạo lại) để vô hiệu hóa tất cả các vé cho một người dùng (hoặc tất cả) đã cho. Nhưng tôi không thể tìm thấy một API để làm điều này.

Trả lời

7

Trong global.asax, hãy thêm trình xử lý cho AuthenticateRequest. Trong phương pháp này, việc xác thực biểu mẫu đã diễn ra và bạn được tự do sửa đổi hiệu trưởng hiện tại trước khi bất kỳ điều gì khác xảy ra.

protected void Application_AuthenticateRequest(object sender, EventArgs e) { 
    IPrincipal principal = HttpContext.Current.User; 
    if (!UserStillValid(principal)) { 
    IPrincipal anonymousPrincipal = new GenericPrincipal(new GenericIdentity(String.Empty), null); 
    Thread.CurrentPrincipal = anonymousPrincipal; 
    HttpContext.Current.User = anonymousPrincipal; 
    }  
} 

Chỉ cần triển khai phương pháp UserStillValid và bạn đã hoàn tất. Nó cũng là một nơi tốt để trao đổi các hiệu trưởng chung với một tùy chỉnh nếu bạn cần.

+0

Chức năng UserStillValid sẽ kiểm tra người dùng đang hoạt động trong db hay không? ý nghĩa của Thread.CurrentPrincipal = anonymousPrincipal và HttpContext.Current.User = anonymousPrincipal; – Thomas

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