5

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

4

3 回答 3

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”
    | |
( | 模块 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 网站上找到更好的描述/教程。

于 2008-11-21T04:08:51.190 回答
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

于 2008-11-21T06:34:59.477 回答
0

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

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

有关应用程序域和工作进程的更多信息,请考虑阅读此博客条目。希望有帮助。

于 2009-02-10T09:03:03.537 回答