授权和ASP.NET MVC缓存

6
我对 ASP.NET MVC 缓存和授权感到困惑,需要一些澄清。
我自己编写了一个授权属性,继承自AuthorizeAttribute。即使我在控制器操作上设置了[OutputCache]属性,它覆盖的AuthorizeCore方法也会每次运行。我理解这一点。
现在,对我来说难以理解的是:AuthorizeCore现在每次都会失败,而实际上页面已经从缓存中提供服务。原因是当请求被缓存时,作为AuthorizeCore参数的httpContext.Session变量却为null!下面是一些简化代码:
protected override bool AuthorizeCore(HttpContextBase httpContext) {
    return (Session["userId"] != null)
}

如果httpContext.Sessionnull,那么每次都会失败。但我需要访问session,否则我怎么检查请求是否经过授权?这没有任何意义 - 如果应该是这样的话,那么我在ASP.NET MVC中将永远无法同时使用缓存页面和身份验证。有没有帮助?
1个回答

13

有两个分开的问题:

  1. 在MVC中,身份验证是否与缓存配合工作?
  2. 在缓存面前,会话是否在身份验证之前起作用(即使对于未经身份验证的用户,他们仍然拥有希望唯一的会话)?

答案分别是“是”和“否”。身份验证与缓存很好地配合工作。尝试使用SQL或Domain成员资格提供程序;您会看到。

然而,缓存可以在身份验证模块之前运行。(额外加分:为什么?)身份验证仅在特定挂钩缓存时才被调用(如AuthorizeAttribute所做的那样)。因为会话是用户特定的,所以在AuthorizeCore中没有保证您将拥有一个会话。

更多加分题:如果在缓存配置中指定varyByUser,这将如何更改?

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

另外需要注意的一点是:ASP.NET Session提供程序和ASP.NET Membership提供程序是完全独立的。不同的会员用户可以共享一个会话,而且是的,您可以通过这种方式攻击网站。将安全相关信息放入会话中永远不是安全的。安全很困难。


那么你的意思是,如果我使用基于常规asp.net成员资格提供程序的自定义成员资格提供程序,我可以使用缓存来检查用户身份验证?为什么会这样 - 成员资格提供程序也需要内部会话吗? - Alex
2
把安全敏感信息放在Session中永远不是安全的选择,这点毋庸置疑。 - Craig Stuntz
1
不,常规会员提供程序与Session几乎没有任何关系。请阅读我回答中的最后两个链接。 - Craig Stuntz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接