无法使用 Chrome 登录 Dot Net Core 3 ASP.Net App,但可以使用 Firefox

Posted

技术标签:

【中文标题】无法使用 Chrome 登录 Dot Net Core 3 ASP.Net App,但可以使用 Firefox【英文标题】:Can't log in to Dot Net Core 3 ASP.Net App with Chrome, but works with Firefox 【发布时间】:2020-08-09 03:10:08 【问题描述】:

我的 dot net core 3.1 Web 应用程序中有以下代码,前端有角度。 dot net core 站点基本上就是一堆 API 控制器。所有前端的东西都由 Angular 9 应用程序处理。

public async Task<LogInResultDto> LogIn(LoginDto request)

    var user = await _userManager.FindByNameAsync(request.UserName);
    if (user != null)
    
        SignInResult result = await _signInManager.PasswordSignInAsync(user, request.Password, request.RememberMe, false);
        return result.ToDto();
    

    return new LogInResultDto()
    
        Success = false
    ;

在 Firefox 中这很好用,我可以在我的控制器中查询 User?.Identity?.IsAuthenticated,如果用户已登录,它会返回 true。在 chrome 中,此值始终为 false。登录成功,但是这个值返回false。

在我的启动中,我有以下代码。同样,这一切在 Firefox 中运行良好,但 Chrome 对一些我无法弄清楚的事情更加严格。

非常感谢任何帮助。

public void ConfigureServices(IServiceCollection services)

   // ... some more things happen before this
    var urlPath = (Configuration.GetValue<string>("Common:BaseUrl") ?? string.Empty);
    var cookie_end = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(urlPath)).Replace("=", "");

    services.AddIdentity<ApplicationUser, IdentityRole>(o =>  )
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddAuthentication()
            .AddCookie(options =>
            
                options.Cookie.HttpOnly = true;
                options.Cookie.Name = "TheCookie_" + cookie_end;
                options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict;
            );

    services.Configure<IdentityOptions>(options =>
    
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = false;
    );

    services.ConfigureApplicationCookie(options =>
    
        options.Cookie.Name = $"TheCookie_cookie_end.Auth";
    );

    services.Configure<CookiePolicyOptions>(options =>
    
        options.MinimumSameSitePolicy = SameSiteMode.Strict;
        options.HttpOnly = HttpOnlyPolicy.None;
        options.Secure = CookieSecurePolicy.Always;
    );

    services.AddMvc(options =>
    
        options.EnableEndpointRouting = false;
    ).SetCompatibilityVersion(CompatibilityVersion.Latest);

   // ... some more stuff after

然后

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceScopeFactory scopeFactory, ILogger<Startup> logger)

    // a few things before here 
    app.UseRouting();

    app.UseCookiePolicy();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "controller/action=Index/id?");
        endpoints.MapRazorPages();
        endpoints.MapBroadcastingEndpoints();
    );

     app.UseSpa(spa =>
    
    );
    // some more things after here

更新 1. 我认为 @Poke 可能会通过他对 https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/ 的评论和 Chrome 更改有关它如何使用 cookie 的某些内容。我很确定这以前在 chrome 中有效。但我似乎无法弄清楚我应该改变什么才能让它再次工作。我可以看到 .Auth Cookie 正在 Chrome 中设置,因此它至少可以部分工作。

更新 2。 只是为了清楚。对于 Chrome 和 Firefox,_signInManager.PasswordSignInAsync(); 返回一个成功的结果。在 Firefox 中,所有后续请求中的 User?.Identity?.IsAuthenticated == true 和所有 User.Claims 都已设置。在 Chrome 中,IsAuthenticated 为 false,并且未设置任何声明。

更新 3。 我可以看到 Chrome 中也设置了一个 cookie。请注意,我的 cookie 没有命名为“TheCookie”,但我看到的那个以 .Auth 结尾。我只看到这个 cookie,在 Firefox 中也是如此。

来自丁目: 从火狐:

【问题讨论】:

我的猜测没有更多细节:devblogs.microsoft.com/aspnet/… @poke 设置 SamSite.None 或 Unspecified 没有区别,Firefox 可以工作,Chrome 不能。 @poke 但我确实认为你正在做某事,我很确定 Chrome 以前工作过,但最近才停止。也许是因为那次更新。 chrome 开发工具有什么说法吗?还要检查是否实际设置了 cookie。只需比较 Firefox 和 Chrome 的网络工具中的请求即可。 @poke 我知道我的问题是什么,请参阅我的答案。 【参考方案1】:

这最初是用户作为错误提交的,我无法在测试或生产环境中重现,但我可以在本地开发环境中重现它,现在我知道为什么了。

一切都与 HTTPS 有关。

在我的本地开发环境中,我没有启用 HTTPS 重定向。因此,当项目在 Firefox 中构建并启动时,它会转到一个 HTTPS 页面,然后我启动 Chrome 并输入我正在使用 HTTP 访问该站点的地址。 Chrome 不会在 HTTP 站点中包含 cookie,即使它们被标记为不安全(我尝试禁用安全属性但没有成功)。

不过,我不能完全相信这一点,有人帮我测试,他们意识到它只发生在 prod 中,当他们使用 HTTP url 时,它在使用 HTTPS 时无处不在。

现在重定向到 HTTPs 无处不在,每个人都很高兴。

【讨论】:

以上是关于无法使用 Chrome 登录 Dot Net Core 3 ASP.Net App,但可以使用 Firefox的主要内容,如果未能解决你的问题,请参考以下文章

cas单点登录后重定向次数过多问题以及调试cas-dot-net-client

cas单点登录后重定向次数过多问题以及调试cas-dot-net-client

从 Visual Studio Code、Dot Net 连接 MySQL Db

无法从 asp dot net 3.1 中的 appsettings.json 读取字符串数组

Omnisharp 无法正确处理 vscode 中的默认 dot net core 3 应用程序

使用自包含框架时,dot net core 3.1 的设置 CI 构建配置失败