2009-12-08 194 views
1

我有一个HTTPModule做一些基于角色的页面访问安全性(我不得不将一些安全性改进到我们已经获得的一些代码中)。为什么我的HTTPModule中的AcquireRequestState不会触发_sometimes_?

我注意到,在一个实例中,它不会在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:

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

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

回答

3

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

然后,您可以重写在创建页面实例时调用的GetHandler方法,这两个方法都在Response.Redirect和Server.Transfer上。

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

0

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

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

一个关键的评论是这样一个从HttpServerUtility.Transfer documentation

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

+0

是的,你是对的。我刚刚重新检查了我的概念测试网站的初始证明,并且我只能假设我在进行初始测试时喝醉了。 :( 要重新考虑这个想法,使用HTTPModule。 – user129345 2009-12-08 15:50:17

0

Server.Transfer不重新处理目标页面的整个HTTP管道。它只是调用目标页面的HttpHandler。正因为如此,你不应该看到任何早期的应用事件被解雇。

+0

是的,现货,德哦!看到上面的评论。( – user129345 2009-12-08 15:51:02

+0

有点尴尬关于这个,但我会让斯普纳的回答这个问题,因为他也提供了一个解决方案。谢谢你的提高! – user129345 2009-12-09 08:39:54

相关问题