2

我有一个 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 页面。

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

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

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

4

3 回答 3

4

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

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

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

于 2009-12-08T16:39:21.847 回答
0

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

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

HttpServerUtility.Transfer 文档中的一个关键评论是:

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

于 2009-12-08T15:31:01.033 回答
0

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

于 2009-12-08T15:32:13.297 回答