防伪和缓存控制头ASP.NET核心

问题描述 投票:0回答:1

我试图覆盖由asp.net core 2.0的默认防伪设置的cache-control标头集

.net核心始终将其设置为no-cache, no-store。我正在尝试使用private,它实际上按照我的意愿工作。 no-cache, no-store似乎总是工作,偶尔给我一些antiforgery token was meant for ... user..的错误。哪个设置cache-controlprivate似乎解决了。

但是.net核心不允许我覆盖防伪设置的默认cache-control

我试过以下:

  public async Task<IActionResult> Login(string returnUrl)
  {
          HttpContext.Response.Headers.Append(Microsoft.Net.Http.Headers.HeaderNames.CacheControl, "private");
       ....
  }

 public class NoCacheAttribute : ActionFilterAttribute
 {
       public override void OnResultExecuting(ResultExecutingContext context)
       {
        // tried both
        //context.HttpContext.Response.Headers.Add(HeaderNames.CacheControl, "private");
        //context.HttpContext.Response.Headers[HeaderNames.CacheControl] = "private";
       }
 }

注意:目前仅用于http

c# asp.net-core asp.net-core-2.0 cache-control antiforgerytoken
1个回答
0
投票

使用防伪保护需要Cache-Control: no-cache, no-store标头。绝对不能在任何情况下缓存具有令牌的页面,因为为该资源的每个请求重新生成令牌,并且必须发回正确的令牌以进行验证。换句话说,绝对必须每次都从服务器请求新鲜。 private值不够好,因为它仍然允许在某些情况下进行缓存。

出现错误的原因是用户身份验证状态已更改,页面加载后以及提交表单之前。这可能是由用户登录或注销引起的。防伪令牌使用经过身份验证的用户作为其自身的一部分,因此,如果用户的身份验证状态发生更改,则在提交后令牌将不再有效。如果用户登录或注销,则需要确保刷新页面,以便可以设置新的防伪cookie。

© www.soinside.com 2019 - 2024. All rights reserved.