【问题标题】:Get cookie fails immediately after set cookie in ASP.NET Core在 ASP.NET Core 中设置 cookie 后立即获取 cookie 失败
【发布时间】:2020-11-16 17:04:37
【问题描述】:

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

SO 3230133 在 PHP 的上下文中提出了相同的问题,并且答案表明在将响应发送回客户端之前不会设置 cookie,并且在您的 PHP 中不可用,直到来自之后的客户。在 ASP.NET Core 的上下文中是否也是如此?是否有类似于 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()

【问题讨论】:

    标签: c# asp.net-core cookies


    【解决方案1】:

    这可能与 GDPR 和 .NET Core 应用在未经明确同意的情况下未设置必要的 cookie 有关。

    看看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);
    

    【讨论】:

    • 这是一个很好的建议,但不幸的是,您提出的更改并没有解决我机器上的问题。我很想知道是否有人可以通过从 OnPost() 方法调用 MyCookies.Set() 来在 ASP.NET Core 3.1 WebApp 中复制该问题,如上所示。
    【解决方案2】:

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

    我曾希望使用 Cookie 来存储中间件中确定的文化设置,因为我怀疑存储它 Thread.CurrentThread.CurrentUICulture 在异步方法中不起作用,因为无法保证线程与使用的线程相同对于我的中间件所做的设置。任何人都可以提出解决方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多