Я успешно настроил аутентификацию с помощью Azure AD B2C в своем приложении ASP.NET Core Blazor. Я могу открыть веб-сайт (https://localhost:5001) на нескольких вкладках без повторного входа в систему. Однако, если я оставлю сервер работающим, но закрою и снова открою браузер и перейду на веб-сайт, мне потребуется снова войти в систему. Насколько я понял, это должно было держать меня в системе между сеансами браузера. Я довольно новичок во всем этом, поэтому я даже не уверен, с чего начать поиск проблемы. Есть идеи, что это может быть?
Вот мой Startup.cs
, если поможет.
public class Startup
{
private IConfiguration Configuration { get; }
public Startup(IConfiguration configuration) => Configuration = configuration;
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAdB2C"));
services.AddControllersWithViews().AddMicrosoftIdentityUI();
services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
services.AddRazorPages();
services.AddServerSideBlazor().AddMicrosoftIdentityConsentHandler();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/_Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
Если это файл cookie сеанса, попробуйте установить срок действия, вызвав ConfigureApplicationCookie
с ExpireTimeSpan
, как показано здесь
Я вижу только один файл cookie (.AspNetCore.Cookies), и это файл cookie сеанса. Я добавил метод ConfigureApplicationCookie
с ExpireTimeSpan
60 минут, но это ничего не изменило. Файл cookie по-прежнему является файлом cookie сеанса.
Тем не менее, я подтвердил, что это проблема. Ручная установка времени истечения срока действия файла cookie в DevTools «решает» проблему. Я просто не смог успешно настроить время истечения срока действия в Startup.cs.
Я нашел решение своей проблемы. Спасибо @huysentruitw за то, что направил меня на правильный путь.
TL;DR: создание собственного AccountController
и настройка AuthenticationProperties.IsPersistent
на true
при входе в систему исправили истечение срока действия файла cookie авторизации и в конечном итоге решили мою проблему.
Проблема заключалась в том, что файл cookie токена аутентификации не сохранялся в сеансах браузера. Он всегда создавал файл cookie, но, глядя в DevTools, срок действия всегда был установлен на «Сеанс». Однако настройка времени истечения срока действия с помощью параметров, доступных в Startup.cs
, также не решила эту проблему. Я пробовал следующее:
ConfigureApplicationCookie
с помощью CookieAuthenticationOptions.Cookie.Expires
.ConfigureApplicationCookie
с помощью CookieAuthenticationOptions.ExpireTimeSpan
.AddMicrosoftIdentityWebApp
, используя перегрузку, чтобы предоставить configureCookieAuthenticationOptions
заполненное свойство CookieBuilder.Expires
.Независимо от того, что я делал, срок действия файла cookie истек после «Сеанса».
Итак, я вошел в код аутентификации ASP.Net Core (класс CookieAuthenticationHandler
в Microsoft.AspNetCore.Authentication.Cookies
), чтобы выяснить, почему не использовалось значение срока действия. Я обнаружил, что CookieOptions.Expires
по какой-то причине переопределяется (в методе BuildCookieOptions
) и что срок действия устанавливается только в том случае, если AuthenticationProperties.IsPersistent
равно true
(вы можете видеть, как это происходит в методе HandleSignInAsync
). Итак, моим следующим шагом было выяснить, как установить это в true. Я обнаружил, что AuthenticationProperties
задаются AccountController
, который автоматически добавляется при вызове Startup.cs
в .AddMicrosoftIdentityUI
. Вместо этого я скопировал этот AccountController
в свой проект в качестве отправной точки и избавился от вызова .AddMicrosoftIdentityUI
. Затем я обновил AuthenticationProperties
, чтобы установить IsPersistent
на true
, что в конечном итоге устранило проблему. Файл cookie теперь проходит с датой/временем истечения срока действия.
Я не знаю, пропустил ли я что-то, но мне это определенно кажется ошибкой или, по крайней мере, очень плохим опытом настройки. Надеюсь, кто-нибудь придет и потенциально укажет на мою ошибку, но это то, что сработало для меня. Я думаю, что в любом случае имеет смысл включить AccountController
в мой проект, чтобы я мог видеть, что происходит, и подстраивать его по мере необходимости.
Флаг IsPersistent обычно связан с флажком «Запомнить меня» на страницах входа. Но так как это AD B2C, это должно хотя бы где-то настраиваться. С другой стороны, выполнение кругового пути к Azure AD для каждого сеанса браузера не так уж плохо, так как он проверяет, известно ли удостоверение в AD. Разве вы не можете вместо этого настроить истечение срока действия на уровне AD, чтобы каждый раз вместо входа в систему требовалось только обращение туда и обратно?
Также смотрите learn.microsoft.com/en-us/azure/active-directory-b2c/…
Это именно то, чего я ожидал. На самом деле я видел тот же документ и убедился, что мой пользовательский поток AD B2C настроен правильно. Я установил время ожидания сеанса Rolling, которое, по его словам, должно продлевать сеанс каждый раз, когда мы выполняем аутентификацию на основе файлов cookie. Но это не решило проблему. Для каждого нового сеанса по-прежнему требовался вход в систему.
Это не должно требовать ввода учетных данных, но потребует, чтобы пользователь щелкнул «войти» в приложении, а затем AAD B2C автоматически войдет в систему пользователя, используя свои постоянные файлы cookie. То есть до тех пор, пока у приложения не будет собственного постоянного сеанса.
Когда вы смотрите на файл cookie аутентификации в браузере, имеет ли он срок действия или это файл cookie «сеанса»?