[英]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.