Срок действия 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 дней.