У меня есть следующий код в моем 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.
От Чоме: От Firefox: