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

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

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

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

因此,如果<=>是<=>,这显然每次都会失败。我需要访问会话,我还能如何检查请求是否被授权?这没有任何意义 - 如果这是它应该如何,那么我永远不会能够在ASP.NET MVC中使用缓存页面和身份验证。帮助

有帮助吗?

解决方案

有两个不同的问题:

  1. 身份验证是否适用于MVC中的缓存?
  2. 会话在缓存面前进行身份验证之前是否有效(即使是未经身份验证的用户,他们仍然希望有一个独特的会话)?
  3. 答案分别是肯定和否定。身份验证适用于缓存。尝试使用SQL或域成员资格提供程序;你会看到的。

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

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

    不幸的是,正确执行身份验证很难,因为做任何类型的安全权都很难。 Microsoft尝试使用成员资格提供程序API使这更容易。

scroll top