Asp.Net Core 2.1 Запрос исключающих куки на стороне клиента - PullRequest
0 голосов
/ 01 февраля 2019

У меня проблема с тем, что файлы cookie, установленные на веб-сайте с использованием javascript, не передаются контроллерам в Запросе.Все файлы cookie, установленные в C #, присутствуют.

В моих файлах 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;              
});

Configure:

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

при проверке файлов cookie в браузере, который я хочу - "ClientTimeZone" присутствует, как видно на этом изображении:

enter image description here

нов контроллере при просмотре запроса на отсутствие файла cookie:

enter image description here

Код JavaScript, который я использую для хранения файлов cookie, выглядит следующим образом:

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 голосов
/ 13 мая 2019

Это связано с пробелами в вашем значении cookie (и в моем случае, Json)..NET Core использует RFC-6265 .Допустимые символы - буквенно-цифровые символы плюс ~!@#$%^&*()-_+[]{}|.Пробел, запятая, точка с запятой, обратная косая черта и кавычки недопустимы.

Самое простое решение - использовать кодировку / декодирование Uri.

Javascript для установки значения cookie:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...