42


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

  1. AuthenticateRequest事件表明配置的身份验证机制已对当前请求进行身份验证。

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

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


Q 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 在执行身份验证之前调用。这是创建您自己的身份验证逻辑的起点。


我错过了什么?


谢谢

4

2 回答 2

54

FormsAuthenticationModule 似乎首先得到处理。这个模块通常早于 ASP.NET 管道中的任何自定义模块,所以当 AuthenticateRequest 被触发时,FormsAuthenticationModule 将首先被调用,完成它的工作,然后你的模块的事件处理程序将被调用。

如果您真的想深入研究,我建议您尝试自己调试 ASP.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 类上的方法,将它们与事件匹配并连接

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

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

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

于 2009-05-17T21:40:57.480 回答
6

如果您想访问 User 对象,我建议您使用

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

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    if(User.Identity.IsAuthenticated)
    {
        //Do stuff here
    }
}
于 2012-02-20T12:03:31.343 回答