Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 这个用于禁止表单身份验证的模块应该如何工作?_Asp.net_.net_Iis_Forms Authentication - Fatal编程技术网

Asp.net 这个用于禁止表单身份验证的模块应该如何工作?

Asp.net 这个用于禁止表单身份验证的模块应该如何工作?,asp.net,.net,iis,forms-authentication,Asp.net,.net,Iis,Forms Authentication,关于用于抑制某些请求的表单身份验证的模块。其思想是在web.config中注册模块,因此对于每个请求,都会调用它的Init(): public void Init(HttpApplication context) { context.PostReleaseRequestState += OnPostReleaseRequestState; context.EndRequest += OnEndRequest; } private void OnEndRequest(object

关于用于抑制某些请求的表单身份验证的模块。其思想是在web.config中注册模块,因此对于每个请求,都会调用它的
Init()

public void Init(HttpApplication context) {
    context.PostReleaseRequestState += OnPostReleaseRequestState;
    context.EndRequest += OnEndRequest;
}
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;
    }
}
然后,一旦请求接近IIS管道的末尾,就会触发
EndRequest
事件,因此调用此代码:

public void Init(HttpApplication context) {
    context.PostReleaseRequestState += OnPostReleaseRequestState;
    context.EndRequest += OnEndRequest;
}
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;
    }
}
其他代码段在前面被调用,并保证在
context.context.Items
中设置了
SuppressAuthenticationKey

现在我有了IIS源代码(它们可供研究),还有
FormsAuthenticationModule
的实现,它订阅
EndRequest
,该请求的处理程序尽职尽责地重定向以HTTP 401代码结束的所有请求

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


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

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

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


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

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

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


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

我以前没有遇到过这个问题,不过非常有趣。不完全确定这是否有用或有帮助,但已找到此属性,该属性暗示在某些情况下允许/可用/可能/需要抑制您正在查看的IIS源的哪个版本,也许它只在IIS 7.5或8中得到支持,尽管我只是猜测?@bUKaneer:您提到的属性是从.NET4.5开始的,我正在查看版本4,所以它还不可用。@bUKaneer:谜团已经解决。我以前从未遇到过这个问题-尽管很有趣。不完全确定这是否有用或有帮助,但已找到此属性,该属性暗示在某些情况下允许/可用/可能/需要抑制您正在查看的IIS源的哪个版本,也许它只在IIS 7.5或8中得到支持,尽管我只是猜测?@bUKaneer:您提到的属性是从.NET4.5开始的,我正在查看版本4,所以它还不可用。@bUKaneer:谜团已经解决。