我正在运行一些测试,为即将推出的 Chrome 版本做准备,更改 SameSite 对 cookie 的处理,但我的 Web 应用程序遇到了麻烦。我可以通过以下方式重现它:
- 使用 Visual Studio 2019 (16.4.3) 创建一个新项目。
- 选择“ASP.NET Core Web 应用程序”并启用 https。
- 添加“脚手架项目”并添加 ASP.NET Core 标识。
询问时,使用 SQLite 搭建所有文件,并添加新的数据上下文和用户:
添加
services.AddRazorPages();
到启动- 添加
endpoints.MapRazorPages();
到UseEndpoints
配置 lambda SameSiteCookiesServiceCollectionExtensions
按照ThinkTecture的建议添加并通过添加services.ConfigureNonBreakingSameSiteCookies();
到您的 Startup 来使用它。或者,只需省略浏览器嗅探部分(我认为这个 repro 不需要),跳过复制链接的解决方案,而是这样做:services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = (Microsoft.AspNetCore.Http.SameSiteMode)(-1); });
添加
app.UseCookiePolicy();
到启动以启用代码- 启动应用程序(对我来说它在 IIS Express 上启动
https://localhost:44342/
) - 导航
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.100
并3.1.101
- 几个
.NET Core runtimes installed
包括Microsoft.AspNetCore.App
版本3.1.0
和3.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 问题的变体,它提到我的版本太低?但我不知道现在如何进行,因为我觉得我已经清除了所有内容。
我在这里想念什么?我需要做什么来解决这个问题?