授权和ASP.NET MVC缓存

我对ASP.NET MVC缓存和授权感到困惑,并且急需一些澄清。

我的自制授权属性inheritance自AuthorizeAttribute 。 即使我在控制器操作上设置了[OutputCache]属性,它每次都会运行其重写的AuthorizeCore方法。 我明白那一部分。

现在让我心烦意乱:当我实际执行输出缓存并且页面是从缓存提供时, AuthorizeCore每次都会失败 。 原因是当缓存请求时, httpContext.Session提供的httpContext.Sessionnull ! 这是一些简化的代码:

 protected override bool AuthorizeCore(HttpContextBase httpContext) { return (Session["userId"] != null) } 

因此,如果httpContext.Sessionnull ,则每次都会失败。 我需要访问会话,如何检查请求是否被授权? 这没有任何意义 – 如果它应该如此,那么我永远无法在ASP.NET MVC中使用缓存页面和身份validation。 救命?

有两个不同的问题:

  1. 身份validation是否适用于MVC中的缓存?
  2. 在面向缓存的身份validation之前,Session是否正常工作(即使是未经身份validation的用户,他们仍然希望拥有独特的会话)?

答案分别是肯定和否定。 身份validation适用于缓存。 尝试使用SQL或域成员资格提供程序; 你会看到的。

但是,缓存可以在身份validation模块之前运行。 (对于奖励积分:为什么?)只有在专门挂钩缓存时才会调用身份validation(如AuthorizeAttribute所做的那样)。 由于会话是特定于用户的,因此无法保证您在AuthorizeCore中有会话。

更多奖励积分:如果您在缓存配置中指定varyByUser,这会如何变化?

不幸的是,正确进行身份validation很难,因为做任何类型的安全权都很难。 Microsoft尝试使用成员资格提供程序API使这更容易。 我强烈建议在实现自定义身份validation时使用它 。 我还建议使用内置提供程序并扩展它们,而不是尽可能重写它们。

另一点:ASP.NET会话提供程序和ASP.NET成员资格提供程序是完全独立的。 不同的成员资格用户可以共享(!)会话, 是的 ,您可以通过这种方式攻击网站。 将安全相关信息放在会话中永远不安全。 安全很难。

Interesting Posts