Я столкнулся с проблемой, при которой роли пользователей, прошедших проверку подлинности Windows, кажутся кэшированными и не обновляются до тех пор, пока я не перезапущу приложение. Хотя роли пользователя меняются нечасто, они меняются и могут измениться до перезапуска приложения.
Я размещаю свое приложение ASP.NET Core 2 на IIS через Пустельга и Модуль ASP.NET Core. Через AuthorizeFilter у меня есть глобальная политика, требующая аутентифицированных пользователей. У пользователей не запрашиваются учетные данные, вместо этого они проходят проверку подлинности с помощью встроенной проверки подлинности Windows. Ниже приведены фрагменты конфигурации моего приложения, которые относятся к конфигурации хоста сервера, аутентификации и авторизации:
private static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(30);
})
.UseIISIntegration()
.Build();
Конфигурация аутентификации
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"));
});
{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:4100",
"sslPort": 0
}
}
}
Все это прекрасно работает, и пользователи должны проходить аутентификацию, и я могу получить их роли в Active Directory. К сожалению, когда эти роли меняются без перезапуска приложения, я не могу получить обновленный список ролей. Это означает, что пользователи, которые должны иметь доступ, его не имеют, а те, у кого больше не должно быть доступа, по-прежнему имеют. Вся моя проверка ролей основана на ClaimsPrincipal.IsInRole("xyz"), который остается неизменным с момента первой аутентификации пользователя. Однако, если я использую System.DirectoryServices.AccountManagement для проверки текущих ролей пользователя в Active Directory, они явно обновляются (для производства нужно использовать встроенные функции и не хочу прибегать к этому).
Какие изменения конфигурации, аннулирование кеша или сброс сеанса мне нужно выполнить, чтобы гарантировать, что при изменении ролей AD пользователя мое приложение будет отражать их текущие роли?
В Windows разрешения файловой системы применяются в тот момент, когда вы нажимаете «Применить». Но, насколько мне известно, членство в группе является частью токена kerberos пользователя. Это может быть сгенерировано только при входе в систему, поэтому для вступления в силу нового членства в группах необходимо, чтобы пользователи выходили из системы и снова входили в нее.
@Neil мое приложение использует встроенную проверку подлинности Windows. Я играл с HttpContext.SignInAsync(), но, возможно, помещаю его не в то место в конвейере, так как он ничего не изменил. Вся проблема похожа на необходимость установки тайм-аута или принудительного обновления.
Это поможет? stackoverflow.com/questions/6690822/…
Проверка подлинности Windows кэшируется IIS на уровне подключения. Как минимум, пользователю потребуется закрыть соединение, чтобы принудительно выполнить повторную авторизацию. См. AuthPersistNonNTLM и authPersistSingleRequest в docs.microsoft.com/en-us/iis/configuration/system.webserver/…. Что произойдет, если они закроют браузер (и соединения) и попытаются снова? Тем не менее, я наблюдал то же, что и VahidN, пользователю часто необходимо выйти из системы и снова войти в систему, прежде чем изменения членства в группе вступят в силу.
Если пользователь запускает клист чистка в командной строке, а затем повторно обращается к приложению, в найденных ролях будет отображаться последнее обновление. Это не требует выхода пользователя из системы. Если вы можете запечь клист чистка в начале вашей последовательности аутентификации, вам будет хорошо. На стороне клиента вы можете запустить приложение с помощью командного файла, который запускает клист чистка, а затем сразу запускает само приложение.


Используется ли это встроенная проверка подлинности Windows или пользователи входят в систему со своими учетными данными Windows? Заявления для пользователя могут быть кэшированы, когда пользователь аутентифицирован, так что, возможно, вы могли бы переиздать их через новый
HttpContext.SignInAsync()?