授权和ASP.NET MVC缓存(Authorization and ASP.NET MVC Cac

2019-07-18 11:12发布

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

我自制的授权属性继承自AuthorizeAttribute 。 其重写AuthorizeCore方法运行每一次,即使我设置一个[OutputCache]属性上的控制器的动作。 我理解的那部分。

现在对我来说,脑筋急转弯: AuthorizeCore会当我实际上做输出缓存和页面从缓存中现在失败每次。 其原因是,当请求被高速缓存,该httpContext.Session与供应AuthorizeCorenull !? 下面是一些简单的代码:

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

所以,如果httpContext.Sessionnull ,这显然没有忘记时间。 我需要,虽然访问会话,我还能怎么检查,如果请求被授权? 这没有任何意义-如果这是应该的话,我将永远无法与在ASP.NET MVC认证一起使用缓存的页面。 救命?

Answer 1:

有两个单独的问题:

  1. 是否与MVC缓存认证工作?
  2. 是否会话在缓存中的脸认证工作之前(即使是未经验证的用户,谁仍然有希望唯一的会话)?

这些问题的答案,分别是yes和no。 认证工作正常缓存。 与SQL或域的成员资格提供试用; 你会看到的。

缓存,但是,可以验证模块之前运行。 (奖励积分:为什么?),如果它明确挂钩缓存(如AuthorizeAttribute一样)认证才调用。 由于会话是用户特定的,也不能保证你有AuthorizeCore的内部会议。

更多积分:如何可能,如果你在你的缓存配置指定varyByUser这种变化?

不幸的是,这样做认证权是很难的,因为做任何形式的担保权是很难的。 微软试图使这更容易与成员资格提供API。 我强烈建议使用实现自定义身份验证时。 我也建议使用内置的提供和扩展它们,而不是重写他们只要有可能。

另一点:ASP.NET会话提供商和ASP.NET会员供应商是完全独立的。 不同的会员用户可以共享(!)会话,并且, 是的 ,你可以攻击一个网站这样。 这是从来没有安全投入与安全有关的信息在一个会话。 安全性是很难的。



文章来源: Authorization and ASP.NET MVC Caching