有什么替代方法可以使用global.asax?

时间:2008-11-21 04:08:15

标签: iis login global-asax

我在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会有所不同吗?

3 个答案:

答案 0 :(得分:10)

HttpModules是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网站上找到更好的描述/教程。

答案 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.aspxhttp://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。希望有所帮助。