在 ASP.NET Core 3.1 Web 应用程序中获取 "Unrecognized SameSiteMode value -1" InvalidOperationException

Getting "Unrecognized SameSiteMode value -1" InvalidOperationException in ASP.NET Core 3.1 Web Application

我正在 运行 进行一些测试,为即将到来的 Chrome 版本做准备,其中更改了 SameSite 对 cookie 的处理,但我的 Web 应用程序出现了问题。我可以通过以下方式重现它:

  1. 使用Visual Studio2019(16.4.3)新建工程
  2. 选择 "ASP.NET Core Web Application" 并启用 https。
  3. 添加 "Scaffolded Item" 并添加 ASP.NET 核心标识。
  4. 当被询问时,使用 SQLite 构建所有文件,并添加新的数据上下文和用户:

  5. services.AddRazorPages();添加到启动

  6. endpoints.MapRazorPages(); 添加到 UseEndpoints 配置 lambda
  7. SameSiteCookiesServiceCollectionExtensions 添加为 suggested by ThinkTecture 并通过将 services.ConfigureNonBreakingSameSiteCookies(); 添加到您的 Startup 来使用它。或者,只需省略浏览器嗅探部分(我认为这个重现不需要),跳过复制链接的解决方案,而是这样做:

    services.Configure<CookiePolicyOptions>(options =>
    {
        options.MinimumSameSitePolicy = (Microsoft.AspNetCore.Http.SameSiteMode)(-1);
    });
    
  8. app.UseCookiePolicy();添加到Startup以启用代码

  9. 启动应用程序(对我来说它在 https://localhost:44342/ 上的 IIS Express 中启动)
  10. 导航到 https://localhost:44342/Identity/Account/Login

我的结果是:

An unhandled exception occurred while processing the request.
InvalidOperationException: Unrecognized SameSiteMode value -1
Microsoft.AspNetCore.CookiePolicy.ResponseCookiesWrapper.ApplyPolicy(string key, CookieOptions options)

完整的堆栈跟踪,是否重要:

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 我会看到:

一些额外的细节和尝试的解决方法:

所以我假设我正面临 this ASP.NET Core GitHub issue 的变体,它提到我的版本太低?但我不确定现在如何进行,因为我觉得我已经清除了所有内容。

我在这里错过了什么?我需要做什么来解决这个问题?

事实证明,如果您不注意并在 Visual Studio 对话框中选择 3.0.x 来创建应用程序,就会发生这种情况。如果你选对了 (3.1.x) 你将得到:

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

在您的 .csproj 文件中,以及 3.1.x 几个软件包的版本。

不确定为什么 Linux 不会特别有问题,也许只是那些机器恰好没有可用或安装的 3.0.x 版本的 dotnet 核心,它运行您的针对 3.1 的代码,从而掩盖了问题?

很多可能性都试过了。 但解决方案是这样的: 你必须安装这个。 ASP.NET 核心运行时 2.1.17