【问题标题】:How is this module for suppressing Forms Authentication supposed to work?这个用于抑制表单身份验证的模块应该如何工作?
【发布时间】:2013-02-19 10:56:22
【问题描述】:

Here's a post 关于用于抑制某些请求的表单身份验证的模块。这个想法是模块在 web.config 中注册,因此对于每个请求,它的 Init() 都会被调用:

public void Init(HttpApplication context) {
    context.PostReleaseRequestState += OnPostReleaseRequestState;
    context.EndRequest += OnEndRequest;
}

然后,一旦请求接近 IIS 管道的末端,EndRequest 事件就会触发,因此会调用以下代码:

private void OnEndRequest(object source, EventArgs args) {
    var context = (HttpApplication)source;
    var response = context.Response;

    if (context.Context.Items.Contains(SuppressAuthenticationKey)) {
      response.TrySkipIisCustomErrors = true;
      response.ClearContent();
      response.StatusCode = 401;
      response.RedirectLocation = null;
    }
}

代码的其他部分更早被调用,并保证SuppressAuthenticationKey 设置在context.Context.Items 中。

现在我有了 IIS 源(它们可用于研究)并且有 FormsAuthenticationModule 的实现,它订阅了 EndRequest,并且该请求的处理程序忠实地重定向了所有以 HTTP 401 代码结尾的请求。

我不仅看到了代码,而且看到它以这种方式工作。 .RedirectLocation = null 的数量对此没有任何影响。

如果重定向在 IIS 中不可抑制,那么该代码应该如何抑制表单身份验证重定向?

【问题讨论】:

  • 我之前没有遇到过这个特殊问题——不过非常有趣。不完全确定这是否有用或有帮助,但已发现此属性暗示在某些情况下允许/可用/可能/需要抑制msdn.microsoft.com/en-us/library/…您正在查看哪个版本的 IIS 源,可能仅在 IIS 7.5 中受支持还是 8 虽然我只是猜测?
  • @bUKaneer:你提到的属性是从 .NET4.5 开始出现的,我正在审查第 4 版,所以它还不可用。
  • @bUKaneer:谜团解开了。

标签: asp.net .net iis forms-authentication


【解决方案1】:

事实证明,这就是这个东西应该如何工作的。

EndRequest 首先触发 FormsAuthenticationModule 并且它的事件处理程序设置了一个重定向,但是重定向并没有立即执行,实际效果是它只是在响应中搁置了 HTTP 302 和重定向 URL,请求处理继续。然后EndRequest 触发抑制模块,抑制模块清除先前设置的重定向,就好像从未设置过一样。

所以请求处理继续进行,就好像一开始没有重定向一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2013-07-20
    • 2018-12-23
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多