Asp.Net Core 2.1请求释放客户端Cookie

时间:2019-02-01 02:09:11

标签: javascript cookies asp.net-core-mvc asp.net-core-2.1

我有一个问题,就是使用JavaScript在网站上设置的cookie不会传递给Request中的控制器。存在用C#设置的所有cookie。

在Startup.cs中,我设置了以下内容:

ConfigureServices:

services.Configure<CookiePolicyOptions>(options =>
{
    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
    options.CheckConsentNeeded = context => false;// must be false otherwise only essential cookies will be allowed
    options.MinimumSameSitePolicy = SameSiteMode.None;              
});

配置:

app.UseCookiePolicy(new CookiePolicyOptions
{
    HttpOnly = HttpOnlyPolicy.None
});

在浏览器中检查cookie时,我想要的一个-“ ClientTimeZone”存在,如该图所示:

enter image description here

,但是在控制器中,当查看不存在cookie的请求时:

enter image description here

我用于存储cookie的JavaScript代码如下:

setCookie: function (name, value, days)
    {
        var expires = "";
        if (days)
        {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = "; expires=" + date.toUTCString();
        }
        document.cookie = name + "=" + (value || "") + expires + ";";
    },

我也尝试添加path=/,但没有运气。

关于Cookie为何无法持久保存到服务器的任何建议?

谢谢

1 个答案:

答案 0 :(得分:0)

这是由于您的cookie值(在本例中为Json)中的空格所致。 .NET Core正在使用RFC-6265。  允许的字符是字母数字加~!@#$%^&*()-_+[]{}|。不允许使用空格,逗号,分号,反斜杠和引号。

最简单的解决方法是使用Uri编码/解码。

设置cookie值的Javascript:

document.cookie = 'ClientTimeZone=' + encodeURIComponent("New Zealand Time") + ';path=/';

C#读取它:

var timeZone = System.Net.WebUtility.UrlDecode(Request.Cookies["ClientTimeZone"]);

问题的根源是将标头值解析为cookie时:

Microsoft.Net.Http.Headers.HttpHeaderParser
{
    protected virtual bool TryParseValues(IList<string> values, bool strict, out IList<T> parsedValues)
}

最终会遇到以下方法,一旦遇到不允许的字符,该方法将立即退出:

Microsoft.Net.Http.Headers.CookieHeaderValue
{
    internal static StringSegment GetCookieValue(StringSegment input, ref int offset)
}

本质上,即使cookie是在请求标头中发送的,任何无法正确解析的cookie都将被静默忽略,并且永远不会包含在IRequestCookieCollection Request.Cookies中。