我使用自定义授权机制,将当前用户会话存储在cookie中。每次有人访问网站时,ActionFilter就会启动,在那里它会验证cookie值和会话状态。
我遇到的问题是-我必须将一些数据POST
发送到另一个网站(https://differentUrl.com)我传递网站的位置returnUrl(https://mywebsiteUrl.com)。不同的网站,在工作完成后,将POST
响应发送回我的returnURL。发生这种情况后,我试图得到的cookie总是null
。
创建这样的cookie(这发生在登录时(:
private readonly IHttpContextAccessor _contextAccessor; //Injected via DI
...
var cookieOptions = new CookieOptions()
{
Expires = DateTime.Now.AddDays(10),
Secure = true,
HttpOnly = false,
SameSite = SameSiteMode.None //Still sets as Lax in browser
};
this._contextAccessor.HttpContext.Response.Cookies.Append("SomeKey", "myEncryptedCookieValue", cookieOptions);
重定向后检索cookie:
var cookieDataString = this._contextAccessor.HttpContext.Request.Cookies["SomeKey"];
cookieDataString
始终是null
。
当我在同一个网站上时,它工作得很好,但当我从另一个网站重定向回来时,它总是null
更新1:
经过研究,我发现这个问题可能会导致SameSite
策略。发现这篇文章使用相同的网站cookie属性,该属性表示当您的网站收到POST
方法时,lax
不是您想要使用的东西。创建cookie时,我将cookie选项设置为SameSiteMode.None
。由于它不起作用,我发现您必须在启动中间件中设置MinimumSameSitePolicy
。
app.UseCookiePolicy(
new CookiePolicyOptions()
{
MinimumSameSitePolicy = SameSiteMode.None
});
删除旧cookie并创建新cookie后,它仍然使用lax
策略创建它。
经过一些研究和处理不同的测试用例,我发现这确实是SameSite
策略,它正在正常工作。主要的问题是它不允许我设置SameSite = SameSiteMode.None
,即使在我添加了MinimumSitePolicy
之后也是如此。
经过一段时间的浏览文档,我发现了这个通用数据保护条例(GDPR(.net核心2.2
我所要做的就是在ConfigureServices()
:中添加这些行
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.None;
});
并在Configure()
中添加app.UseCookiePolicy();
。
在这些修复之后,我最终从cookie中删除了Lax
,在重定向之后,我终于从cookie中获得了一个值。