HTTP缓存的授权检查

时间:2016-08-21 01:56:46

标签: rest http caching http-caching

我为REST服务提供了下面列出的Web API方法。这是为了获取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. 标题应如何使此授权表示形式可缓存?
  4. 或者HTTP Caching是否在授权资源的情况下不能全部使用?

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

      

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

    参考

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

2 个答案:

答案 0 :(得分:1)

从您提供的链接

  

特别是,使用&#34; max-age = 0的响应,必须重新验证&#34;或&#34; s-maxage = 0&#34;如果不在原始服务器上重新验证它,则不能用于满足后续请求。

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

一个简单的测试显示,对asp.net中授权请求的响应设置了以下标题:

  

Cache-Control:private,s-maxage = 0

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

<强>更新

1)此资源是否可以缓存共享缓存(如Forward Proxies和其他中间缓存)?

  

&#34; 缓存控制:私有       指示响应消息的全部或部分是针对单个用户的,并且不得由共享高速缓存进行高速缓存。这允许一个   原始服务器指出该指定的部分       响应仅适用于一个用户,并且不是其他用户请求的有效响应。私有(非共享)缓存可以   缓存响应。*&#34;

     

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

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

<强> NA

3)在共享缓存中实现缓存此类授权内容的不同方法有哪些?

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

  

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

答案 1 :(得分:1)

我从阅读各种资源中理解的是 - 以下标题可能有助于缓存授权资源。

pointerId

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

    1. Rest in Practice - REST+caching+authorize

    2. Web Caching - Authentication