Получение «Нераспознанного значения SameSiteMode -1» InvalidOperationException в ASP. NET Core 3.1 веб-приложении - PullRequest
2 голосов
/ 21 января 2020

Я провожу несколько тестов для подготовки к следующей версии Chrome с изменениями в обработке файлов cookie SameSite, но мое веб-приложение создает проблемы. Я могу воспроизвести его следующим образом:

  1. Используйте Visual Studio 2019 (16.4.3) для создания нового проекта.
  2. Pick "ASP. NET Core Web Приложение »и включите https.
  3. Добавьте« Элемент лесов »и добавьте ASP. NET Core Identity.
  4. При появлении запроса скомпонуйте все файлы и добавьте контекст данных и пользователя fre sh, используя SQLite:

    step 4 in a dialog

  5. Добавить services.AddRazorPages(); к загрузке

  6. Добавить endpoints.MapRazorPages(); в UseEndpoints конфигурацию лямбда
  7. Добавить SameSiteCookiesServiceCollectionExtensions как , предложенный ThinkTecture , и используйте его, добавив services.ConfigureNonBreakingSameSiteCookies(); к своему автозагрузке. В качестве альтернативы просто пропустите часть анализа кода браузера (я думаю, что она не нужна), пропустите копирование связанного решения и вместо этого сделайте следующее:

    services.Configure<CookiePolicyOptions>(options =>
    {
        options.MinimumSameSitePolicy = (Microsoft.AspNetCore.Http.SameSiteMode)(-1);
    });
    
  8. Добавьте app.UseCookiePolicy(); в Startup чтобы включить код

  9. Запустите приложение (для меня оно запускается в IIS Express на https://localhost:44342/)
  10. Перейдите к https://localhost:44342/Identity/Account/Login

Результат для меня:

Произошло необработанное исключение при обработке запроса.
InvalidOperationException: Нераспознанное значение SameSiteMode -1
Microsoft.AspNetCore.CookiePolicy. ResponseCookiesWrapper.ApplyPolicy (строковый ключ, параметры CookieOptions)

Полная трассировка стека, если это важно:

InvalidOperationException: Unrecognized SameSiteMode value -1
Microsoft.AspNetCore.CookiePolicy.ResponseCookiesWrapper.ApplyPolicy(string key, CookieOptions options)
Microsoft.AspNetCore.CookiePolicy.ResponseCookiesWrapper.ApplyAppendPolicy(ref string key, ref string value, CookieOptions options)
Microsoft.AspNetCore.CookiePolicy.ResponseCookiesWrapper.Append(string key, string value, CookieOptions options)
Microsoft.AspNetCore.Authentication.Cookies.ChunkingCookieManager.AppendResponseCookie(HttpContext context, string key, string value, CookieOptions options)
Microsoft.AspNetCore.Authentication.Cookies.ChunkingCookieManager.DeleteCookie(HttpContext context, string key, CookieOptions options)
Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler.HandleSignOutAsync(AuthenticationProperties properties)
Microsoft.AspNetCore.Authentication.AuthenticationService.SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties)
AuthTest.Areas.Identity.Pages.Account.LoginModel.OnGetAsync(string returnUrl) in Login.cshtml.cs
+
            await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.ExecutorFactory+NonGenericTaskHandlerMethod.Execute(object receiver, object[] arguments)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeHandlerMethodAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeNextPageFilterAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Rethrow(PageHandlerExecutedContext context)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Если я проверю dotnet --info, я вижу:

  • Host Version: 3.1.1
  • . NET Установлены основные SDK: целая куча, вплоть до 3.1.100 и 3.1.101
  • Несколько .NET Core runtimes installed, включая Microsoft.AspNetCore.App версии 3.1.0 и 3.1.1

Некоторые дополнительные сведения и попытки orkarounds:

  • csproj содержит <Project Sdk="Microsoft.NET.Sdk.Web">, который должен (насколько я знаю) использовать самые последние доступные вещи
  • Я перезагрузил компьютер, чтобы убедиться, что нет временных проблем с задержкой
  • один коллега с Windows машиной может воспроизвести проблему
  • другой коллега с Linux Mint машиной не имеет проблему
  • Я пробовал dotnet nuget locals all --clear, но это не помогло
  • Я вижу строку ошибки в источниках 3.0.0 , но не в источниках 3.1.0 (или мастер) из ASP NET Core
  • Я пытался dotnet new globaljson --sdk-version 3.1.101 заставить нужную версию, но она не работала (хотя я не уверен, что это правильно способ go об его использовании)
  • Я хочу попытаться удалить указанные c версии с моей машины, но у меня возникают проблемы с удалением вещей (кроме того факта, что версия Функции выбора должны сделать этот подход ненужным, верно?)

Так что я предполагаю Я нахожусь вариант this ASP. NET Core GitHub, проблема , в которой упоминается, что моя версия слишком мала? Но я не уверен, что делать дальше, так как чувствую, что уже все очистил.

Что мне здесь не хватает? Что мне нужно сделать, чтобы это исправить?

1 Ответ

0 голосов
/ 21 января 2020

Оказывается, это происходит, если вы не обращаете внимания и выбираете 3.0.x в диалоговых окнах Visual Studio для создания приложения. Если вы выберете правильный (3.1.x), вы получите:

<PropertyGroup>
  <TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>

в вашем файле .csproj, а также 3.1.x версии нескольких пакетов.

Не конечно, почему Linux не будет иметь проблемы, может быть, просто на этих машинах по совпадению нет доступных или установленных версий 3.0 * x ядра do tnet, и он запускает ваш код против 3.1, таким образом, скрывая проблему?

...