授权和ASP.NET MVC缓存

Ale*_*lex 6 c# asp.net-mvc session authorize asp.net-caching

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

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

现在,对我来说这个问题:现在当我实际执行输出缓存并且从缓存中提供页面时,每次AuthorizeCore都会失败.原因是当缓存请求时,httpContext.Session提供的AuthorizeCorenull!?这是一些简化的代码:

protected override bool AuthorizeCore(HttpContextBase httpContext) {
    return (Session["userId"] != null)
}
Run Code Online (Sandbox Code Playgroud)

所以如果httpContext.Sessionnull,这显然每次都失败了.我需要访问会话,我还能如何检查请求是否被授权?这没有任何意义 - 如果这是它应该如何,那么我永远不能在ASP.NET MVC中使用缓存页面和身份验证.救命?

Cra*_*ntz 12

有两个不同的问题:

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

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

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

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

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

另一点:ASP.NET会话提供程序和ASP.NET成员资格提供程序是完全独立的.不同的成员资格用户可以共享(!)会话,是的,您可以通过这种方式攻击网站.这是从来没有安全投入与安全有关的信息在一个会话.安全很难.

  • 将安全敏感信息放在 Session 中永远是不安全的,句号。 (2认同)