代码之家  ›  专栏  ›  技术社区  ›  Alex

授权和ASP.NET MVC缓存

  •  6
  • Alex  · 技术社区  · 16 年前

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

    我的自制授权属性继承自 AuthorizeAttribute . 它被重写了 AuthorizeCore 方法每次都运行,即使我设置了 [OutputCache] 控制器操作的属性。我明白这一点。

    现在,我的思想弯曲者: 授权中心 失败 每次当我实际执行输出缓存时,页面都是从缓存提供服务的。原因是当请求被缓存时, httpContext.Session 提供 授权中心 null !?以下是一些简化的代码:

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

    所以如果 httpContext.session 无效的 这显然每次都失败了。不过,我需要访问会话,否则如何检查请求是否被授权?这没有任何意义-如果是这样的话,我会的 从未 能够在ASP.NET MVC中使用缓存页和身份验证。帮助?

    1 回复  |  直到 10 年前
        1
  •  12
  •   Craig Stuntz    16 年前

    有两个独立的问题:

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

    答案分别是“是”和“否”。身份验证在缓存中工作正常。使用SQL或域成员资格提供程序进行尝试;您将看到。

    但是,缓存可以在身份验证模块之前运行。(奖励积分:为什么?)仅当它专门挂接缓存时才调用身份验证(如authorizeattribute所做)。因为会话是用户特定的,所以 保证在authorizecore内部有一个会话。

    更多的好处:如果您在缓存配置中指定了varybyuser,这会发生什么变化?

    不幸的是,做身份验证是困难的,因为做任何类型的安全权限都是困难的。Microsoft试图通过成员资格提供程序API简化这一过程。 I strongly recommend using that 实现自定义身份验证时。我还建议使用内置提供者并扩展它们,而不是尽可能地重写它们。

    另外一点:ASP.NET会话提供程序和ASP.NET成员资格提供程序是 完全地 分开。不同的会员用户可以共享!!)会话,以及 yes 你可以 attack 这样的网站。它是 从未 在会话中安全地放置与安全相关的信息。安全很难。

    推荐文章