Срок действия cookie не истекает для аутентификации Azure AD

Я добавляю аутентификацию Azure AD в приложение ASP.NET Core. Приложение зарегистрировано в Azure AD и имеет настраиваемые роли в манифесте. Эти роли используются для политик авторизации в приложении. Все работает, когда пользователи входят в систему, они перенаправляются для входа в Azure и возвращаются с файлом cookie, содержащим их утверждения.

Моя проблема в том, что до тех пор, пока файл cookie не будет удален в браузере, эти утверждения сохраняются и не обновляются при изменении ролей в Azure. Например, если пользователь входит в систему, а затем я удаляю его из роли, приложение все равно будет видеть его в этой роли.

Я попытался установить для файла cookie срок действия 1 минуту, но это не повлияло, и у меня все еще есть та же проблема. Вот как настраивается авторизация вStartup. (AddAzureAd()происходит из этого примера: https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-aspnetcore/blob/master/Extensions/AzureAdAuthenticationBuilderExtensions.cs):

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddAzureAd(options =>
{
    options.ClientId = azureAdOptions.ClientId;
    options.ClientSecret = azureAdOptions.ClientSecret;
    options.Instance = azureAdOptions.Instance;
    options.Domain = azureAdOptions.Domain;
    options.TenantId = azureAdOptions.TenantId;
    options.CallbackPath = azureAdOptions.CallbackPath;
})
.AddCookie(options =>
{
    options.Cookie.Expiration = TimeSpan.FromMinutes(1);
    options.ExpireTimeSpan = TimeSpan.FromMinutes(1);
});

Обновление: изменение Expires к MaxAgeв конфигурации Cookie устанавливает максимальный возраст для Cookie в браузере, который браузер уважает и работает должным образом. Но почемуExpireTimeSpan ничего не делать и принимать файлы cookie старше 1 минуты?

Обновлены параметры файлов cookie:

.AddCookie(options =>
{
    options.Events.OnSignedIn = async e =>
    {
        e.Properties.IsPersistent = true;
        e.Properties.ExpiresUtc = DateTime.UtcNow.AddMinutes(1);
    };
});

Но он все еще принимает файлы cookie намного старше. Если я вхожу в систему, остаюсь на странице в течение 5 минут, затем обновляю ее, аутентифицирует с помощью того же файла cookie. Роли и т.п. не обновляются.

2 ответа

Решение

Если вы хотите контролировать время жизни билета аутентификации, вы можете использовать:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
    options.UseTokenLifetime = false;
    ...

});

services.Configure<CookieAuthenticationOptions>(AzureADDefaults.CookieScheme, options =>
{
    options.ExpireTimeSpan = TimeSpan.FromMinutes(1);
    ...

});

Таким образом, через 1 минуту срок действия билета истекает, при запросе на странице он отправит запрос авторизации в AAD, если пользователь AAD активен, он автоматически войдет в систему снова, чтобы получить новые токены и сопоставить утверждения пользователей.

Но почему ExpireTimeSpan ничего не делает и не принимает файлы cookie старше 1 минуты?

Абсолютное время истечения может быть установленоExpiresUtc. Чтобы создать постоянный файл cookie,IsPersistentтакже должен быть установлен. В противном случае cookie создается с временем существования на основе сеанса и может истечь либо до, либо после билета проверки подлинности, который он содержит. когдаExpiresUtcустановлен, он переопределяет значение изExpireTimeSpan вариант.

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    }
);

TimeSpan, после которого истекает срок действия билета проверки подлинности, хранящегося в файле cookie. ExpireTimeSpan добавляется к текущему времени, чтобы создать время истечения срока действия билета. Значение ExpiredTimeSpan всегда входит в зашифрованный AuthTicket, проверенный сервером. Он также может входить в заголовок Set-Cookie, но только если установлен IsPersistent. Чтобы задать для IsPersistent значение true, настройте AuthenticationProperties, передаваемые в SignInAsync. Значение ExpireTimeSpan по умолчанию - 14 дней.

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