为什么我的HTTPModule中的AcquireRequestState不会触发_sometimes_?

时间:2009-12-08 15:14:07

标签: asp.net httpmodule server.transfer

我有一个HTTPModule可以执行一些基于角色的页面访问安全性(我必须将一些安全性改进为我们已经获得的一些代码)。

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

以下是代码片段:

        ' 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页面。

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

我会发布代码库的更多详细信息,但它是如此令人费解和蔓延,这是一个解释的噩梦。

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

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

关键评论来自HttpServerUtility.Transfer documentation

  

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

答案 2 :(得分:0)

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