AuthenticateRequest事件

Q 1.我的理解FormsAuthenticationModule订阅了AuthenticateRequest事件,因此只有在这个事件被触发之后, FormsAuthenticationModule才会被调用。 但是下面的引用让我有些困惑:

  1. AuthenticateRequest事件表示configuration的authentication机制已经authentication了当前的请求。

    • 上面的引用不是说当AuthenticateRequest事件发生时,请求(又名用户)已经被authentication了吗?
  2. 订阅AuthenticateRequest事件可确保在处理附加的模块或事件处理程序之前对请求进行身份validation。

    • 据我了解这个引用,如果我们订阅AuthenticatedRequest ,那么我们的事件处理程序将在FormsAuthenticationModule之前被调用? 因此Application_AuthenticateRequest()将在FormsAuthenticationModule被调用之前调用?

问2.我从中学习的书,build议在Application_AuthenticateRequest()我们能够validation用户是否是特定angular色的成员,如果没有,我们可以自动添加用户:

  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() } } 

从上面的代码判断,在调用FormsAuthenticationModule之后调用Application_AuthenticateRequest() ,但是在别的地方,同一本书意味着在FormsAuthenticationModule之前调用Application_AuthenticateRequest()

Application_AuthenticateRequest在执行authentication之前被调用。 这是创build您自己的身份validation逻辑的起点。

我错过了什么?

感谢名单

看来FormsAuthenticationModule首先被处理。 这个模块通常比ASP.NETpipe道中的任何自定义模块早,所以当启动AuthenticateRequest时,FormsAuthenticationModule将首先被调用,执行它的工作,然后你的模块的事件处理程序将被调用。

如果你真的想深入这个,我build议你自己debuggingASP.NET代码。 这里有一篇文章如何设置您的VS:

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

编辑 :我能够通过在Global.asax中设置具有自定义模块和事件处理程序的Web项目来确认此行为。 看看HttpApplication.InitInternal的源代码,初始化的顺序如下:

  • 集成模块的初始化:FormsAuthenticationModule挂接到HttpApplication.AuthenticateRequest事件
  • 自定义模块的初始化:自定义模块挂钩到HttpApplication.AuthenticateRequest事件
  • Global类(global.asax)的初始化:在这里我们连接到AuthenticateRequest事件
  • HttpApplication.InitInternal按照特定的名称模式(例如Application_AuthenticateRequest)在Global类中search方法,将它们匹配到事件并挂接

在初始化之后,当AuthenticateRequest触发时,事件处理程序按照初始化的顺序被调用,所以:

  • FormsAuthenticationModule.AuthenticateRequest事件处理程序
  • CustomModule.AuthenticateRequest事件处理程序
  • Global.AuthenticateRequest事件处理程序
  • Global.Application_AuthenticateRequest方法

除非我错过了某些东西,否则没有机制来阻止事件处理程序的触发,所以无论FormsAuthenticationModule.AuthenticateRequest的结果如何,下一个处理程序仍将被调用。 我希望有帮助。

如果你想访问用户对象,我build议你使用

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