12

我想写一个IHttpModule必须严格执行的FormsAuthenticationModule,否则就没用了。

HttpContext.Current.ApplicationInstance.Modules返回 s 集合的属性IHttpModule。我可以检查我的模块是否FormsAuthenticationModule在此集合中。

这样就够了吗?该集合列表是否IHttpModule按照它们的执行顺序排列?

4

2 回答 2

16

回想一下,模块可以订阅不同的管道事件。在任何给定的管道事件中,模块应该按照它们在 Modules 集合中指定的顺序运行。

作为一个实际示例,想象一个 Modules 集合,其中注册了这三个模块:

  • 订阅 EndRequest 的模块 A
  • 订阅 BeginRequest 和 EndRequest 的模块 B
  • 订阅 AuthenticateRequest 的模块 C

执行顺序将是:

  1. 模块 B,开始请求
  2. 模块 C,AuthenticateRequest
  3. 模块 A,结束请求
  4. 模块 B,结束请求

由于 FormsAuthenticationModule 订阅了 AuthenticateRequest 事件,请考虑让您自己的模块订阅 PostAuthenticateRequest 事件。这样,您就可以保证如果 FormsAuthenticationModule 逻辑运行,它会在您的 logic 之前运行,而不管它们在 Modules 集合中注册的顺序如何。

于 2013-02-20T07:07:01.323 回答
2

我会尽量回答。

我认为您不应该依赖 HttpContext.Current.ApplicationInstance.Modules 集合,因为您现在将按照哪个顺序执行模块。

请注意,我没有做任何原型,这只是我的想法。

dll Microsoft.Web.Infrastructure.dll 有一个动态注册 HTTP 模块的方法

该 dll 随 WebPages 1.0 一起提供

为注册创建助手类

public static class RegisterHttpModuleHelper
{

    public static void Start()
    {

        DynamicModuleUtility.RegisterModule(typeof(YourCustomModule));
    }
}

FormsAuthenticationModule 具有事件“身份验证”。

在此事件的处理者中,尝试使用动态注册您的自定义 HttpModule

public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
    RegisterHttpModuleHelper.Start()
}
于 2013-02-20T07:08:26.590 回答