我正在使用自己的自定义身份验证与IIS,我希望每个页面上的服务器加载(无论什么类型的文件)首先检查应用程序变量,以查看用户是否经过身份验证并有权查看该站点.在global.asax中,这可能是:
void Application_Start(Object Sender, EventArgs e) { if(Application["username"] == null) { Response.redirect("login.aspx"); } }
问题是这个站点有多个子根.也就是说,http://example.com/site1 是一个与http://example.com/site2完全不同的网站.因此,我想说Application_Start函数在site1上工作但不影响site2.
如果global.asax可以在目录级别自定义,那么这不会是一个问题.但由于每个服务器只有一个global.asax,因此我无法实现此解决方案.
global.asax还有哪些替代方案?或者global.asax能以某种方式为每个目录不同吗?
(另请参阅https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm
http://codebetter.com/blogs /karlseguin/archive/2006/06/12/146356.aspx)
HttpModules在web.config中注册; 其中,方便,是在目录级定制.因此,每个目录都可以拥有自己独特的模块集(在较低的目录中继承).所有模块都具有与global.asax相同的功能.
基本上,每个页面请求在到达实际页面代码本身之前都会通过每个已注册的模块.无论它是什么类型的请求,都会发生这种情况:
"page.aspx" "page.html" | | ( | module 1 | ) ( | module 2 | ) ( | module 3 | ) V V (handler 1) (handler 2)
((更好的图片和描述可以在https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm找到)))
因此,您需要做的就是将代码定义为模块而不是global.asax.如果用户未经过身份验证,则:response.redirect("login.aspx")
将停止控制从到达处理程序并解析/返回/运行请求的页面.
它比这复杂一点,因此可以在codeguru网站上找到更好的描述/教程.