我有一个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事件不会触发?'
答案 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。因此,您不应该看到任何早期的应用程序事件被触发。