代码之家  ›  专栏  ›  技术社区  ›  Alexander Bird

除了使用global.asax,还有什么其他选择?

  •  5
  • Alexander Bird  · 技术社区  · 16 年前

    我在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函数在站点1上工作,但不影响站点2。

    如果global.asax可以在目录级别进行自定义,那么这就不是问题。但由于只有一个global.asax 服务器 我无法实施这个解决方案。

    global.asax有哪些替代方案?或者global.asax对于每个目录是否会有所不同?

    3 回复  |  直到 16 年前
        1
  •  10
  •   Hugo K Alexander Bird    7 年前

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

        2
  •  1
  •   Nathan    16 年前

    我非常确定,一旦一个人登录,你的代码将允许所有人访问——可能不是你想要的。

    根据 http://msdn.microsoft.com/en-us/library/ms178473.aspx :

    “当ASP.NET应用程序中的第一个资源(如页面)被请求时调用 应用程序_启动 方法是 只打过一次电话 在应用程序的生命周期内”

    此外,根据 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
  •  0
  •   Tyler    16 年前

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

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

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

    推荐文章