39


AuthenticateRequest kiện

Q 1. Để hiểu biết của tôi FormsAuthenticationModule được đăng ký AuthenticateRequest sự kiện, và do đó chỉ sau khi sự kiện này là bắn, là FormsAuthenticationModule gọi. Nhưng có dấu ngoặc kép sau đã cho tôi một chút nhầm lẫn:

  1. Các AuthenticateRequest tín hiệu sự kiện rằng cơ chế xác thực cấu hình đã được chứng thực theo yêu cầu hiện tại.

    • Không những trích dẫn ở trên đề nghị rằng khi AuthenticateRequest sự kiện được nêu ra, theo yêu cầu (hay còn gọi là người sử dụng) đã được chứng thực?
  2. Đăng ký sự kiện AuthenticateRequest đảm bảo rằng yêu cầu sẽ được xác thực trước khi xử lý các mô-đun hoặc xử lý sự kiện kèm theo.

    • Theo như tôi hiểu câu nói này, nếu chúng ta đăng ký vào AuthenticatedRequest, sau đó xử lý sự kiện của chúng tôi sẽ được gọi trước khi FormsAuthenticationModule? Vì vậy, Application_AuthenticateRequest() sẽ được gọi trước khi FormsAuthenticationModule được gọi?


Q 2. Sách Tôi đang học hỏi từ gợi ý rằng trong vòng Application_AuthenticateRequest() chúng tôi có thể xác minh xem người dùng là thành viên của vai trò cụ thể, và nếu không, chúng ta có thể thêm người dùng tự động:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
      if (User.Identity.IsAuthenticated && Roles.Enabled) 
      { 

       //here we can subscribe user to a role via Roles.AddUserToRole() 
      }  
    } 

Đánh giá từ các mã trên, Application_AuthenticateRequest() được gọi sau khi FormsAuthenticationModule đã được gọi, nhưng ở một nơi khác cùng cuốn sách ngụ ý rằng Application_AuthenticateRequest() được gọi trước khi FormsAuthenticationModule:

Application_AuthenticateRequest được gọi là ngay trước khi xác thực được thực hiện. Đây là điểm nhảy để tạo logic xác thực của riêng bạn.


tôi thiếu gì?


Thanx

Trả lời

50

Dường như FormsAuthenticationModule bị xử lý đầu tiên. Module này thường sớm hơn bất kỳ mô-đun tùy chỉnh nào trong đường dẫn ASP.NET, vì vậy khi AuthenticateRequest được kích hoạt, FormsAuthenticationModule sẽ được gọi đầu tiên, thực hiện công việc của nó và sau đó trình xử lý sự kiện của mô-đun sẽ được gọi.

Nếu bạn thực sự muốn tìm hiểu sâu về vấn đề này, tôi khuyên bạn nên tự mình gỡ lỗi mã ASP.NET.Đây là một bài làm thế nào để thiết lập VS của bạn:

http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx

EDIT: Tôi đã có thể để xác nhận hành vi này bằng cách thiết lập một dự án web với mô-đun tùy chỉnh và sự kiện xử lý trong Global.asax. Hãy nhìn vào mã nguồn của HttpApplication.InitInternal, thứ tự khởi tạo như sau:

  • khởi các module tích hợp: FormsAuthenticationModule móc lên đến HttpApplication.AuthenticateRequest kiện
  • khởi của mô-đun tùy chỉnh: móc mô-đun tùy chỉnh lên đến HttpApplication.AuthenticateRequest kiện
  • khởi của lớp toàn cầu (global.asax): ở đây chúng tôi treo lên với sự kiện AuthenticateRequest
  • HttpApplication.InitInternal tìm kiếm các phương pháp trên lớp toàn cầu theo mô hình tên cụ thể (ví dụ Application_AuthenticateRequest), Phù hợp với họ để sự kiện và móc lên

Sau khi khởi động, khi các đám cháy AuthenticateRequest, xử lý sự kiện được gọi theo thứ tự chúng nơi khởi tạo, vì vậy:

  • xử lý sự kiện FormsAuthenticationModule.AuthenticateRequest
  • CustomModule.AuthenticateRequest xử lý sự kiện
  • Global.AuthenticateRequest xử lý sự kiện
  • Global.Application_AuthenticateRequest phương pháp

Trừ khi tôi bỏ sót điều gì đó, không có cơ chế để dừng trình xử lý sự kiện để kích hoạt, vì vậy không có vấn đề gì kết quả của FormsAuthenticationModule.AuthenticateRequest, trình xử lý tiếp theo sẽ vẫn được gọi. Tôi hy vọng rằng sẽ giúp.

+0

Q1 Nếu tôi hiểu bạn một cách chính xác, sau đó khi AuthenticateRequest cháy, FormsAuthenticationModule được gọi là đầu tiên, sau đó Application_AuthenticateRequest() và chỉ sau đó được mô-đun xác thực tùy chỉnh được gọi là? Q2 - Nhưng điều gì về báo giá MSDN đó (“Sự kiện AuthenticateRequest báo hiệu rằng cơ chế xác thực được cấu hình đã xác thực yêu cầu hiện tại”), ngụ ý rằng AuthenticateRequest chỉ được kích hoạt sau khi FormsAuthenticationModule thực hiện công việc của mình? – SourceC

+1

Câu trả lời chi tiết trong bài đăng. Liên quan đến Q2 - Tôi đoán nó không hoàn toàn đúng: “Sự kiện AuthenticateRequest báo hiệu rằng cơ chế xác thực được cấu hình đã xác thực yêu cầu hiện tại” - nó chắc chắn đã xử lý sự kiện trên FormsAuthenticationModule, nhưng chúng tôi không biết kết quả;) – bbmud

+1

thanx. Bạn đã thực sự giúp tôi với điều này – SourceC

5

Nếu bạn muốn truy cập vào đối tượng người dùng, tôi muốn đề nghị bạn sử dụng

protected void Application_Start() 
{ 
    PostAuthenticateRequest += Application_PostAuthenticateRequest; 
} 

protected void Application_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if(User.Identity.IsAuthenticated) 
    { 
     //Do stuff here 
    } 
}