Не могу войти в Dot Net Core 3 ASP. Net Приложение с Chrome, но работает с Firefox - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть следующий код в моем dot net core 3.1 web-приложении с angular веб-интерфейсом. Основной сайт dot net - это просто набор контроллеров 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.

В моем запуске у меня есть код ниже. Опять же, все это прекрасно работает в 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 изменения чего-либо, относящегося к тому, как он использует печенье. Я совершенно уверен, что это работало в chrome раньше. Но я не могу понять, что я должен изменить, чтобы заставить его работать снова. Я вижу, что .Auth Cook ie устанавливается в Chrome, поэтому он хотя бы частично работает.

Обновление 2. Просто чтобы прояснить ситуацию. И с Chrome, и с Firefox, _signInManager.PasswordSignInAsync(); возвращает успешный результат. В Firefox User?.Identity?.IsAuthenticated == true во всех последующих запросах установлены и все User.Claims. В Chrome IsAuthenticated указано значение false, и никакие претензии не установлены.

Обновление 3. Я вижу, что повар ie также устанавливается в Chrome. Обратите внимание, что мой повар ie не называется "TheCook ie", но тот, который я вижу, заканчивается .Auth. Я вижу только этого повара ie, того же самого в Firefox.

От Чоме: enter image description here От Firefox: enter image description here

1 Ответ

0 голосов
/ 26 апреля 2020

Изначально это было зарегистрировано пользователем как ошибка, и я не мог воспроизвести его в тестовой или производственной среде, но я мог воспроизвести его в своей локальной среде разработчика, и теперь я знаю, почему.

Все дело в HTTPS.

В моей локальной среде разработчика у меня не было включено перенаправление HTTPS. Поэтому, когда проект был построен и запущен в firefox, он перешел на страницу HTTPS, когда я тогда запустил Chrome и набрал адрес, по которому я посещал сайт с HTTP. Chrome не включает файлы cookie на HTTP-сайтах, даже если они помечены как небезопасные (я попытался отключить безопасное свойство, но безуспешно).

Я не могу взять на себя всю ответственность за это, имел человек, помогающий мне в тестировании, и они поняли, что это происходило только в prod, когда они заходили с использованием URL-адреса HTTP, и оно работало везде при использовании HTTPS.

Теперь перенаправление на HTTP включено везде, и все довольны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...