1

这是一篇关于用于抑制某些请求的表单身份验证的模块的帖子。这个想法是模块在 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;
    }
}

代码的其他部分更早被调用,并保证SuppressAuthenticationKeycontext.Context.Items.

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

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

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

4

1 回答 1

1

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

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

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

于 2013-02-20T05:14:44.003 回答