3

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

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

    对话框中的步骤 4

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

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

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

  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 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了,但没有帮助
  • 我可以在 3.0.0 源中看到错误行,但在 ASP NET Core 的 3.1.0 源(或主控)中看不到
  • 我试图dotnet new globaljson --sdk-version 3.1.101强制使用正确的版本,但它没有用(尽管我不确定这是否是使用一个的正确方法)
  • 我想尝试从我的机​​器上删除特定版本,但我在卸载东西时遇到了问题(除了版本选择功能应该使这种方法变得不必要,对吧?)

所以我我正面临这个 ASP.NET Core GitHub 问题的变体,它提到我的版本太低?但我不知道现在如何进行,因为我觉得我已经清除了所有内容。

我在这里想念什么?我需要做什么来解决这个问题?

4

2 回答 2

1

事实证明,如果您不注意并在 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 运行您的代码,从而掩盖了问题?

于 2020-01-21T11:42:15.443 回答
1

已经尝试了许多可能性。但解决方案是: 你必须安装它。ASP.NET Core 运行时 2.1.17

于 2020-09-30T12:43:20.847 回答