Asp.net 这个用于禁止表单身份验证的模块应该如何工作?
关于用于抑制某些请求的表单身份验证的模块。其思想是在web.config中注册模块,因此对于每个请求,都会调用它的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
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:谜团已经解决。