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

时间:2018-09-05 09:19:56

标签: c# asp.net-core asp.net-core-2.0 cache-control antiforgerytoken

我试图覆盖默认情况下asp.net core 2.0的cache-control标头设置

.net核心始终将其设置为no-cache, no-store。我正在尝试使用private,它实际上可以按我的意愿工作。 no-cache, no-store似乎并不总是能正常工作,偶尔会给我带来antiforgery token was meant for ... user..类错误。将cache-control设置为private似乎可以解决。

但是.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

1 个答案:

答案 0 :(得分:0)

使用防伪保护需要 <tbody>{this.state.jobData.map(function (item, key) { if (!item.isEditable) { return ( <tr key={key}> <td><b style={compName}>{item.id}</b></td> <td><b style={compName}>{item.attributes.companyName}</b></td> <td>Xamarian Developer</td> <td>{item.attributes.name}</td> <td><b style={compName}>30</b></td> <td><b style={compName}>30</b></td> </tr> ) } else { return ( //Add your editable row here ) } })}</tbody> 标头。绝对不会在任何情况下缓存带有令牌的页面,因为针对该资源的每个请求都会重新生成令牌,并且必须将正确的令牌发送回以进行验证。换句话说,绝对必须每次都从服务器请求新鲜的请求。 Cache-Control: no-cache, no-store值不够好,因为它仍然允许在某些情况下进行缓存。

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