繁体   English   中英

在 ASP.NET Core 中设置 cookie 后立即获取 cookie 失败

[英]Get cookie fails immediately after set cookie in ASP.NET Core

我在 ASP.NET 核心 WebApp 中设置并获取 cookies。 Microsoft Docs说“使用 HttpResponse.Cookies 集合添加 cookie 后,即使尚未将响应发送到客户端,该 cookie 也会立即在 HttpRequest.Cookies 集合中可用” 但是,我发现设置后无法立即读取cookie; 请参阅下面的 Set(),它总是返回 false。 也就是说,浏览器的存储检查器显示它实际上已设置。

SO 3230133在 PHP 的上下文中提出了同样的问题,答案表明在将响应发送回客户端之前不会设置 cookie,并且在您的 PHP 之后的下一个请求之前不可用。 在 ASP.NET 内核的上下文中是否也是如此? 是否有类似于 PHP $_COOKIE['uname'] 的解决方法用于在某处设置 cookie 值,以便可以在客户端发出下一个请求之前读取它?

Microsoft Docs 与.NetFramework 4.8 相关,但没有.Net Core 的替代品。 这是否适用于前者,但不适用于后者?

public class MyCookies
{
   public IHttpContextAccessor Accessor { get; private set; }

   public MyCookies(IHttpContextAccessor accessor)
   {
      Accessor = accessor;
   }

   public bool Set(string name, string value)
   {
      var rc = false;
      Accessor.HttpContext.Response.Cookies.Append(name, value); 
      if (Accessor.HttpContext.Request.Cookies.TryGetValue(name, out var result) && (result == value))
         rc = true;
      return rc;
   }
}

public class SettingsModel : PageModel
{
   private readonly IHttpContextAccessor _httpContextAccessor;

   public SettingsModel(IHttpContextAccessor httpContextAccessor)
   {
      _httpContextAccessor = httpContextAccessor;
   }

   public IActionResult OnPost()
   {
      var cookies = new MxCookies(_httpContextAccessor);
      if (cookies.SetValue(".AspNetCore.Culture", "fr-CH") == false)
      {
         var stop = true; 
      }
      return new RedirectToPageResult("Index");
   }
}

不要忘记在 Startup.ConfigureServices() 中调用 services.AddHttpContextAccessor()

这可能与 GDPR 和 .NET Core 应用程序有关,未经明确同意,未设置必要的 cookies。

看看https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.1

本质上,您需要在设置 cookie 时传入以下选项:

var options = new CookieOptions
{
    Expires = DateTime.Now.AddMinutes(60),
    IsEssential = true
};

Accessor.HttpContext.Response.Cookies.Append(name, value, options);

不幸的是,在 .NET Core 中,cookie 不会立即在 HttpRequest.Cookies 集合中可用。 在这方面,该行为不同于ASP.NET Core issue 24442中确认的 Framework 行为。

我曾希望使用 Cookie 来存储中间件中确定的区域性设置,因为我怀疑存储它 Thread.CurrentThread.CurrentUICulture 在异步方法中不起作用,因为不能保证线程与用于设置的线程相同由我的中间件制作。 任何人都可以建议解决方法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM