ASP.NET Core Auth не остается в системе после закрытия браузера (Azure AD B2C)

Я успешно настроил аутентификацию с помощью 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 аутентификации в браузере, имеет ли он срок действия или это файл cookie «сеанса»?

huysentruitw 25.12.2020 22:08

Если это файл cookie сеанса, попробуйте установить срок действия, вызвав ConfigureApplicationCookie с ExpireTimeSpan, как показано здесь

huysentruitw 25.12.2020 22:10

Я вижу только один файл cookie (.AspNetCore.Cookies), и это файл cookie сеанса. Я добавил метод ConfigureApplicationCookie с ExpireTimeSpan 60 минут, но это ничего не изменило. Файл cookie по-прежнему является файлом cookie сеанса.

Tanner Taylor 25.12.2020 22:23

Тем не менее, я подтвердил, что это проблема. Ручная установка времени истечения срока действия файла cookie в DevTools «решает» проблему. Я просто не смог успешно настроить время истечения срока действия в Startup.cs.

Tanner Taylor 25.12.2020 23:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
942
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение своей проблемы. Спасибо @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, чтобы каждый раз вместо входа в систему требовалось только обращение туда и обратно?

huysentruitw 26.12.2020 11:50

Также смотрите learn.microsoft.com/en-us/azure/active-directory-b2c/…

huysentruitw 26.12.2020 11:52

Это именно то, чего я ожидал. На самом деле я видел тот же документ и убедился, что мой пользовательский поток AD B2C настроен правильно. Я установил время ожидания сеанса Rolling, которое, по его словам, должно продлевать сеанс каждый раз, когда мы выполняем аутентификацию на основе файлов cookie. Но это не решило проблему. Для каждого нового сеанса по-прежнему требовался вход в систему.

Tanner Taylor 26.12.2020 19:42

Это не должно требовать ввода учетных данных, но потребует, чтобы пользователь щелкнул «войти» в приложении, а затем AAD B2C автоматически войдет в систему пользователя, используя свои постоянные файлы cookie. То есть до тех пор, пока у приложения не будет собственного постоянного сеанса.

Jas Suri - MSFT 28.12.2020 11:43

Другие вопросы по теме