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

标签 c# asp.net-core samesite

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

  1. 使用 Visual Studio 2019 (16.4.3) 创建一个新项目。
  2. 选择“ASP.NET Core Web 应用程序”并启用 https。
  3. 添加“脚手架项”并添加 ASP.NET Core 标识。
  4. 当被要求时,使用 SQLite 构建所有文件,并添加新的数据上下文和用户:

    step 4 in a dialog

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

  6. 添加endpoints.MapRazorPages();进入UseEndpoints配置lambda
  7. 添加SameSiteCookiesServiceCollectionExtensions作为suggested by ThinkTecture并通过添加 services.ConfigureNonBreakingSameSiteCookies(); 来使用它到你的启动。或者,只需省略浏览器嗅探部分(我认为此重现不需要),跳过复制链接的解决方案,而是执行以下操作:

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

  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我明白了:

  • Host Version: 3.1.1
  • 已安装 .NET Core SDK:一大堆,包括 3.1.1003.1.101
  • 几个.NET Core runtimes installed包括 Microsoft.AspNetCore.App版本 3.1.03.1.1

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

  • csproj 包含 <Project Sdk="Microsoft.NET.Sdk.Web">应该(据我所知)使用最新的东西
  • 我已经重新启动以确保没有挥之不去的暂时性问题
  • 一位使用 Windows 机器的同事可以重现该问题
  • 另一位使用 Linux Mint 机器的同事没有有问题
  • 我试过了dotnet nuget locals all --clear但这没有帮助
  • 我可以看到错误行 in the 3.0.0 sources但不是in the 3.1.0 sources ASP NET Core(或硕士)
  • 我试过dotnet new globaljson --sdk-version 3.1.101强制使用正确的版本,但它不起作用(尽管我不确定这是否是使用一个版本的正确方法)
  • 我想尝试从我的机​​器上删除特定版本,但我 run into problems uninstalling things (除了版本选择功能应该使该方法变得不必要之外,对吗?)

所以我假设我面对的是 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 运行您的代码,从而掩盖了问题?

关于c# - 在 ASP.NET Core 3.1 Web 应用程序中获取 "Unrecognized SameSiteMode value -1"InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59836767/

相关文章:

c# - Microsoft Solver Foundation 变量限制

asp.net-mvc - 使用ASP.NET Core和MVC存储本地文件

redirect - SameSite=严格的 cookie 和带有重定向的跨站点请求

google-chrome - 如何从命令行启用Chrome功能?

asp.net-core - 对 ASP.NET Core 使用远程验证

firefox - 之前设置的 "Samesite: Strict"cookie 在 document.cookie 中不可用 Firefox 和 Safari

c# - 以正确的方式做干燥的事情

c# - 更新 selenium 后无法将 IWebElement 转换为 IWebElement

c# - 在 C# .net 中创建两个任务并在特定时间段后关闭其中一个任务

c# - 带有 include 的 PublishOptions 在调试 Asp.net Core 上不起作用