【问题标题】:Authorization check for HTTP CachesHTTP 缓存的授权检查
【发布时间】:2016-12-27 20:44:29
【问题描述】:

我有如下所列的 Web API 方法,用于REST 服务。这是为了获取 InventoryAuditors 的所有用户信息。只有授权的 InventoryAuditor 用户才能访问此资源。

[RoutePrefix("api/users")]
public class UsersController : ApiController
{
    [Authorize(Roles="InventoryAuditor")]
    [Route("")]
    [HttpGet]
    public List<User> GetAllUsers()
    {
        //Return list of users
    }

}

public class User
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
}

问题

  1. 此资源是否可缓存用于 shared caches(如 Forward Proxies 和其他中间缓存)?
  2. 如果是,共享缓存如何执行授权检查 - 缓存如何知道必须仅为 InventoryAuditors 提供资源?
  3. 标题应如何使该授权表示可缓存?

或者HTTP Caching不是全部用于授权资源的情况下?

注意:文章"Caching Tutorial for Web Authors and Webmasters"说:

默认情况下,使用 HTTP 身份验证保护的页面被认为是私有的;它们不会被共享缓存保存。但是,您可以使用 Cache-Control: public header 公开经过身份验证的页面;然后,符合 HTTP 1.1 的缓存将允许它们被缓存。

参考文献

  1. https://www.rfc-editor.org/rfc/rfc7235#section-4.2
  2. https://www.rfc-editor.org/rfc/rfc7234#section-3.2
  3. https://www.rfc-editor.org/rfc/rfc7234#section-5.2.2
  4. Hypertext Transfer Protocol (HTTP/1.1): Caching
  5. Feature: Bearer Authentication- Squid
  6. Stupid Web Caching Tricks

【问题讨论】:

    标签: rest http caching http-caching


    【解决方案1】:

    我从阅读各种资源中了解到 - 以下标头可能有助于缓存授权资源。

    Cache-Control: public, max-age=0

    1. Max-Age = 0:需要缓存以使用服务器重新验证 有条件的 GET 请求。在使用服务器重新验证时, 授权标头将被发送到服务器。
    2. max-age=0 与 must-revalidate 不同。 max-age=0 允许缓存 还包含授权标头的响应。

    另请参阅

    1. Rest in Practice - REST+caching+authorize

    2. Web Caching - Authentication

    【讨论】:

      【解决方案2】:

      来自您提供的链接

      特别是,“max-age=0, must-revalidate”或“s-maxage=0”的响应不能用于满足后续请求,除非在源服务器上重新验证它。

      转发 Web 代理应该能够检查响应的 Cache-Control 标头以确定它是否可用于服务器后续请求

      一个简单的测试表明,asp.net 中对授权请求的响应具有以下标头集:

      缓存控制:私有,s-maxage=0

      这是根据协议,实际处理响应缓存的方式取决于您使用的 Web 服务器。

      更新

      1) 此资源是否可用于共享缓存(如转发代理和其他中间缓存)?

      "缓存控制:私有 表示响应消息的全部或部分是针对单个用户的,并且不得由共享缓存缓存。这允许一个 源服务器声明指定的部分 响应仅适用于一个用户,而不是对其他用户请求的有效响应。私有(非共享)缓存可以 缓存响应。*"

      https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

      2) 如果是,共享缓存如何执行授权检查 - 缓存如何知道资源必须仅为 InventoryAuditors 提供?

      不适用

      3) 实现在共享缓存中缓存此类授权内容的不同方法是什么?

      您可以以编程方式将标头设置为您想要操纵共享代理的缓存行为的任何内容

      代理重新验证 proxy-revalidate 指令与 must-revalidate 指令含义相同,除了它不适用于非共享 用户代理缓存。它可以用于对经过身份验证的响应 请求允许用户的缓存存储并稍后返回 响应而无需重新验证它(因为它已经 由该用户验证一次),同时仍然需要代理 每次为许多用户提供服务以重新验证(以确保 每个用户都已通过身份验证)。 注意,这样的认证 响应还需要公共缓存控制指令,以便 允许它们被缓存。* https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

      【讨论】:

      • 阅读文章"Caching Tutorial for Web Authors and Webmasters"。它说:“默认情况下,受 HTTP 身份验证保护的页面被认为是私有的;它们不会被共享缓存保存。但是,您可以使用 Cache-Control: public 标头将经过身份验证的页面公开;然后,符合 HTTP 1.1 的缓存将允许它们被缓存。” .那为什么说不可能呢?
      • 这就是你第三个问题的答案中提到的。需要身份验证的响应的默认行为是不被共享代理缓存(缓存控制:私有,s-maxage=0)。但是,如果您想覆盖此行为,您可以在发送响应之前设置自己的 Cache 标头(Cache-Control:public,no-cache),如文章所述,或(Cache-Control:public,proxy-revalidate)。如果您只是使用带有 public 修饰符的过期缓存,未经身份验证的用户可能会从缓存中获取服务器表示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多