我在IIS中使用自己的自定义身份验证,我希望每个页面上的服务器加载(无论是什么类型的文件),首先检查Application变量以查看用户是否已通过身份验证并有权查看该网站。在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会有所不同吗?
答案 0 :(得分:10)
(另见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网站上找到更好的描述/教程。
答案 1 :(得分:1)
我非常确定您的代码会在一个人登录后允许访问所有人 - 可能不是您想要的。
根据http://msdn.microsoft.com/en-us/library/ms178473.aspx:
“在请求ASP.NET应用程序中的第一个资源(例如页面)时调用。 Application_Start 方法在生命周期中仅调用一次申请“
此外根据http://support.microsoft.com/kb/307598#1 “应用程序状态变量实际上是每个ASP.NET应用程序的全局变量。”
我建议您使用内置的Membership API并使用web.config文件限制访问。
如果您打开使用Membership API而不是滚动自己的身份验证机制,则可以使用web.config检查用户是否有权使用特定文件夹。您还可以相对简单地让用户在一个站点上登录,并通过共享身份验证票据自动登录到其他站点 - 前提是它们都在同一个根域中。
要共享身份验证票证,请参阅: http://msdn.microsoft.com/en-us/library/ms998288.aspx和http://www.netomatix.com/development/singlesignon.aspx
有关如何使用web.config限制访问: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=85
答案 2 :(得分:0)
实际上我相信每个asp.net应用程序只有一个global.asax。如果您希望example.com/subsite1与example.com/subsite2中的应用程序不同,则可以在IIS中创建两个不同的应用程序。因此,它们将在完全不同的应用程序域中运行(尽管它们可能处于相同的进程(aspnet_wp.exe或w3wp.exe),甚至可以共享应用程序池)。因此,如果它们是不同的应用程序,它们也应该拥有独立的global.asax文件。
将目录转换为应用程序。打开IIS->找到目录/子站点,右键单击 - >属性 - >主目录选项卡 - >单击“创建”。
有关应用程序域和工作进程的更多信息,请考虑reading this blog entry。希望有所帮助。