问1.根据我的理解,FormsAuthenticationModule
订阅AuthenticateRequest
事件,因此只有在此事件被触发后才会调用FormsAuthenticationModule
。但是下面的引言让我有些困惑:
AuthenticateRequest
事件表示配置的身份验证机制已对当前请求进行了身份验证。
AuthenticateRequest
事件时,请求(也就是用户)已经过身份验证? 订阅
AuthenticateRequest
事件可确保在处理附加模块或事件处理程序之前对请求进行身份验证。
AuthenticatedRequest
,那么我们的事件处理程序将在FormsAuthenticationModule
之前调用?因此,在调用Application_AuthenticateRequest()
之前会调用FormsAuthenticationModule
吗?
问2.我正在学习的书建议在Application_AuthenticateRequest()
内我们能够验证用户是否是特定角色的成员,如果没有,我们可以自动添加用户:
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()
}
}
从上面的代码判断,调用Application_AuthenticateRequest()
后会调用FormsAuthenticationModule
,但在其他地方同一本书暗示Application_AuthenticateRequest()
之前调用了FormsAuthenticationModule
:
在执行身份验证之前调用
Application_AuthenticateRequest
。 这是创建自己的身份验证逻辑的起点。
我错过了什么?
感谢名单
答案 0 :(得分:51)
似乎首先处理FormsAuthenticationModule。此模块通常早于ASP.NET管道中的任何自定义模块,因此当激活AuthenticateRequest时,将首先调用FormsAuthenticationModule,执行其工作,然后调用模块的事件处理程序。
如果您真的想深入研究这个问题,我建议您尝试自己调试ASP.NET代码。以下是如何设置VS的帖子:
编辑:我可以通过在Global.asax中设置包含自定义模块和事件处理程序的Web项目来确认此行为。看一下HttpApplication.InitInternal的源代码,初始化顺序如下:
初始化后,当AuthenticateRequest触发时,事件处理程序按初始化的顺序调用,所以:
除非我遗漏了某些内容,否则没有停止触发事件处理程序的机制,因此无论FormsAuthenticationModule.AuthenticateRequest的结果如何,仍将调用下一个处理程序。我希望有所帮助。
答案 1 :(得分:5)
如果您想要访问User对象,我建议您使用
protected void Application_Start()
{
PostAuthenticateRequest += Application_PostAuthenticateRequest;
}
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if(User.Identity.IsAuthenticated)
{
//Do stuff here
}
}