Asp.net 为什么我的HTTPModule中的equirestate有时不会启动?

Asp.net 为什么我的HTTPModule中的equirestate有时不会启动?,asp.net,httpmodule,server.transfer,Asp.net,Httpmodule,Server.transfer,我有一个HTTPModule,它执行一些基于角色的页面访问安全性(我必须在我们获得的一些代码中改进一些安全性) 我注意到,在一个实例中,它不会在Server.Transfer上启动 下面是一段代码: ' move to target page Select Case eTransferMethod Case TargetPageTransferMethod.Redirect Page.Response.Redirect(strPag

我有一个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.TransferCase。该页面将是一个.aspx页面

现在我知道AcquisiteQuestState是在其他服务器上启动的。在这段代码中转移调用。事实上,它会在回发时被触发,当页面上的按钮被点击时。具有讽刺意味的是,我的安全代码在传输到此页面时被绕过,但在单击此页面的“取消”按钮时拒绝回发的访问!:周:

我会发布代码库的更多细节,但它是如此复杂和蔓延,这将是一个噩梦来解释


因此,基本上我是在问“当调用Server.Transfer时,是什么原因导致HTTPModule中的AcquisiteRequestState事件未触发?”

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

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

关键评论如下:

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


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

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

然后,您可以重写GetHandler方法,无论是在Response.Redirect还是在Server.Transfer上,每当创建页面实例时都会调用该方法


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

是的,您是对的。我刚刚重新检查了我的初始概念验证测试现场,我只能假设我在进行初始测试时喝醉了(必须重新考虑使用HTTPM模块的想法。是的,没错,哦!请看上面的评论。:(对此有点尴尬,但我要让斯普纳回答这个问题,因为他也提供了一个解决方案。不过谢谢你的提醒!