簡體   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