AuthenticateRequest事件
Q 1.我的理解FormsAuthenticationModule
订阅了AuthenticateRequest
事件,因此只有在这个事件被触发之后, FormsAuthenticationModule
才会被调用。 但是下面的引用让我有些困惑:
-
AuthenticateRequest
事件表示configuration的authentication机制已经authentication了当前的请求。- 上面的引用不是说当
AuthenticateRequest
事件发生时,请求(又名用户)已经被authentication了吗?
- 上面的引用不是说当
-
订阅
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:
编辑 :我能够通过在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 } }