使用 global.asax 都有哪些替代方法?

Posted

技术标签:

【中文标题】使用 global.asax 都有哪些替代方法?【英文标题】:what alternatives are there to using global.asax?使用 global.asax 有哪些替代方法? 【发布时间】:2008-11-21 04:08:15 【问题描述】:

我在 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 可以在目录级别进行自定义,那么这将不是问题。但是由于每个 server 只有一个 global.asax,我无法实现这个解决方案。

global.asax 有哪些替代品?或者每个目录的 global.asax 会有所不同吗?

【问题讨论】:

【参考方案1】:

HttpModules 是 global.asax 的替代品

(另见https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htmhttp://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx)

HttpModules 在 web.config 中注册;方便的是, 可以在目录级别进行自定义。所以每个目录都可以有自己独特的一组模块(在较低的目录中继承)。所有模块都具有与 global.asax 中相同的功能。

基本上,每个页面请求都会通过每个注册的模块,然后才能到达实际的页面代码本身。无论是哪种请求,都会发生这种情况:

“page.aspx” “page.html” | | ( | 模块 1 | ) ( | 模块 2 | ) ( | 模块 3 | ) 五五 (处理程序 1) (处理程序 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 网站上找到更好的描述/教程。

【讨论】:

【参考方案2】:

我很确定,一旦一个人登录,您的代码将允许所有人访问 - 可能不是您想要的。

根据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

【讨论】:

【参考方案3】:

实际上,我相信每个 asp.net 应用程序只有一个 global.asax。如果您希望 example.com/subsite1 成为与 example.com/subsite2 不同的应用程序,您可以在 IIS 中创建两个不同的应用程序。因此,它们将在完全不同的应用程序域中运行(尽管它们可能在同一个进程(aspnet_wp.exe 或 w3wp.exe)中,甚至共享应用程序池)。因此,如果它们是不同的应用程序,它们也应该拥有独立的 global.asax 文件。

将目录转换为应用程序。打开IIS->找到目录/子站点,右键->属性->主目录选项卡->点击“创建”。

有关应用程序域和工作进程的更多信息,请考虑reading this blog entry。希望对您有所帮助。

【讨论】:

以上是关于使用 global.asax 都有哪些替代方法?的主要内容,如果未能解决你的问题,请参考以下文章

Global.asax

Global.asax调试

为 http 和 https 端点配置带有路由 (global.asax) 的 WCF 4

Global.asax - FxCop 警告冲突 CA1811 与 CA2109

MVC RedirectToAction 在 global.asax 中调用 Session_Start()

Global.asax.cs介绍