【问题标题】:Why would AcquireRequestState in my HTTPModule not fire _sometimes_?为什么我的 HTTPModule 中的 AcquireRequestState _sometimes_ 不会触发?
【发布时间】:2009-12-08 15:14:07
【问题描述】:

我有一个 HTTPModule,它执行一些基于角色的页面访问安全性(我必须在我们获得的一些代码中改进一些安全性)。

我注意到在一个实例中它不会在 Server.Transfer 上触发。

这是代码的sn-p:

        ' move to target page
    Select Case eTransferMethod
        Case TargetPageTransferMethod.Redirect
            Page.Response.Redirect(strPage, False)
        Case TargetPageTransferMethod.Transfer
            Context.Handler = Me
            Page.Server.Transfer(strPage)
        Case TargetPageTransferMethod.None
            ' Do nothing
    End Select

我在这里谈论的案例是 TargetPageTransferMethod.Transfer 案例。该页面将是一个 .aspx 页面。

现在我知道 AcquireRequestState 在此代码中的其他 Server.Transfer 调用上被触发。实际上,当单击传输到的页面上的按钮时,它会在回发时触发。具有讽刺意味的是,我的安全代码在传输到此页面时被绕过,但在单击此页面的取消按钮时拒绝回发访问! :eek:

我会发布代码库的更多细节,但它是如此复杂和庞大,解释起来将是一场噩梦。

所以基本上我在问'什么可能导致 HTTPModule 中的 AcquireRequestState 事件在调用 Server.Transfer 时不会触发?'

【问题讨论】:

    标签: asp.net httpmodule server.transfer


    【解决方案1】:

    解决这个问题的方法是创建一个继承 System.Web.UI.PageHandlerFactory 类的自定义 HttpHandler。

    然后,您可以覆盖在创建页面实例时调用的 GetHandler 方法,无论是在 Response.Redirect 还是在 Server.Transfer 上。

    注册此新处理程序以使用“*.aspx”扩展名,所有页面将自动使用新处理程序。这允许您在 Server.Transfer 上进行自定义授权以及使用依赖注入框架(例如 MS Unity)。

    【讨论】:

      【解决方案2】:

      我可以理解它是在回发时调用的,因为这是来自客户端的另一个请求,但 Server.Transfer 不会发起新请求,它会将执行从一个页面转移到另一个页面。

      由于 AcquireRequestState 事件在“当 ASP.NET 获取与当前请求相关联的当前状态(例如会话状态)时”触发 - 这将发生在来自浏览器的初始请求上,而不是在服务器上传输,因为服务器没有收到另一个请求,您只是要求它处理不同的页面。

      一个重要的评论是来自HttpServerUtility.Transfer documentation

      ASP.NET 不会验证当前用户是否有权查看由 Transfer 方法传递的资源。虽然 ASP.NET 授权和身份验证逻辑在调用原始资源处理程序之前运行,但 ASP.NET 直接调用 Transfer 方法指示的处理程序,并且不会为新资源重新运行身份验证和授权逻辑。如果您的应用程序的安全策略要求客户端具有适当的授权才能访问资源,则应用程序应强制重新授权或提供自定义访问控制机制。

      【讨论】:

      • 是的,你是对的。我刚刚重新检查了我最初的概念验证测试站点,我只能假设我在进行初始测试时喝醉了。 :( 不得不重新考虑使用 HTTPModule 的想法。
      【解决方案3】:

      Server.Transfer 不会重新处理目标页面的整个 HTTP 管道。它只是调用目标页面的 HttpHandler。因此,您不应该看到任何较早的应用程序事件被触发。

      【讨论】:

      • 是的,准确,d'oh!请参阅上面的评论。 :(
      • 对此有点尴尬,但我会让 Spooner 回答这个问题,因为他也提供了解决方案。不过感谢您的提醒!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2014-07-01
      • 2017-06-27
      • 2016-02-10
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多