Я столкнулся с проблемой, из-за которой роли пользователей, прошедших проверку подлинности Windows, кэшируются и не обновляются, пока я не перезапущу приложение.Хотя роли пользователей меняются не часто, они меняются и могут меняться до перезапуска приложения.
Я размещаю свое приложение ASP.NET Core 2 на IIS через Kestrel и Базовый модуль ASP.NET .Через AuthorizeFilter
у меня есть глобальная политика, которая требует аутентифицированных пользователей.Пользователям не предлагается ввести учетные данные, но вместо этого они проходят проверку подлинности с помощью встроенной проверки подлинности Windows.Ниже приведены фрагменты конфигурации моего приложения, которые относятся к конфигурации хоста сервера, аутентификации и авторизации:
Фрагменты из Program.cs
private static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(30);
})
.UseIISIntegration()
.Build();
Фрагменты из Startup.cs
Конфигурация аутентификации
services.AddAuthentication(options =>
{
options.DefaultScheme = IISDefaults.AuthenticationScheme;
options.DefaultForbidScheme = IISDefaults.AuthenticationScheme;
});
Конфигурация авторизации
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAuthenticatedUser",
policyBuilder => policyBuilder.RequireAuthenticatedUser());
});
Добавление Global AuthorizeFilter
:
services.AddMvc(mvcOptions =>
{
mvcOptions.Filters.Add(new AuthorizeFilter("RequireAuthenticatedUser"));
});
Фрагмент из launchSettings.json
{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:4100",
"sslPort": 0
}
}
}
Все это прекрасно работает, и пользователям требуется аутентификация, и я могу получить их роли Active Directory.К сожалению, когда эти роли меняются без перезапуска приложения, я не могу получить обновленный список ролей.Это означает, что пользователи, которые должны иметь доступ, не имеют, а те, которые больше не должны иметь доступ, все еще делают.Вся моя проверка ролей основана на ClaimsPrincipal.IsInRole("xyz")
, который остается неизменным с момента первой аутентификации пользователя.Тем не менее, если я использую System.DirectoryServices.AccountManagement
для проверки текущих ролей пользователя в Active Directory, они явно обновляются (для производства хотят использовать встроенные функции и не хотят прибегать к этому).
Какие изменения конфигурации, аннулирование кэша или сброс сеанса мне нужно выполнить, чтобы гарантировать, что при изменении ролей AD пользователя мое приложение будет отражать их текущие роли?