6

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

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

现在让我费解的是:当我实际进行输出缓存并且页面从缓存中提供时,每次AuthorizeCore都会失败。原因是当请求被缓存时,httpContext.Session提供的AuthorizeCorenull!? 这是一些简化的代码:

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

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

4

1 回答 1

13

有两个单独的问题:

  1. 身份验证是否适用于 MVC 中的缓存?
  2. Session 在面对缓存进行身份验证之前是否有效(即使对于未经身份验证的用户,他们仍然有一个希望唯一的会话)?

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

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

更多奖励点:如果您在缓存配置中指定了 varyByUser,这会如何改变?

不幸的是,做认证权是困难的,因为做任何类型的担保权都是困难的。Microsoft 尝试通过成员资格提供程序 API 简化此操作。我强烈建议在实现自定义身份验证时使用它。我还建议使用内置提供程序并对其进行扩展,而不是尽可能重写它们。

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

于 2009-09-18T01:49:09.010 回答