Обновление утверждений пользователей и ролей для пользователя, прошедшего проверку подлинности Windows, в ASP.Net Core 2

Я столкнулся с проблемой, при которой роли пользователей, прошедших проверку подлинности Windows, кажутся кэшированными и не обновляются до тех пор, пока я не перезапущу приложение. Хотя роли пользователя меняются нечасто, они меняются и могут измениться до перезапуска приложения.

Я размещаю свое приложение ASP.NET Core 2 на IIS через Пустельга и Модуль ASP.NET Core. Через 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 пользователя мое приложение будет отражать их текущие роли?

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

Neil 21.05.2018 05:42

В Windows разрешения файловой системы применяются в тот момент, когда вы нажимаете «Применить». Но, насколько мне известно, членство в группе является частью токена kerberos пользователя. Это может быть сгенерировано только при входе в систему, поэтому для вступления в силу нового членства в группах необходимо, чтобы пользователи выходили из системы и снова входили в нее.

VahidN 21.05.2018 08:47

@Neil мое приложение использует встроенную проверку подлинности Windows. Я играл с HttpContext.SignInAsync(), но, возможно, помещаю его не в то место в конвейере, так как он ничего не изменил. Вся проблема похожа на необходимость установки тайм-аута или принудительного обновления.

ahsteele 21.05.2018 18:00

Это поможет? stackoverflow.com/questions/6690822/…

Tarun Lalwani 21.05.2018 21:17

Проверка подлинности Windows кэшируется IIS на уровне подключения. Как минимум, пользователю потребуется закрыть соединение, чтобы принудительно выполнить повторную авторизацию. См. AuthPersistNonNTLM и authPersistSingleRequest в docs.microsoft.com/en-us/iis/configuration/system.webserver/‌…. Что произойдет, если они закроют браузер (и соединения) и попытаются снова? Тем не менее, я наблюдал то же, что и VahidN, пользователю часто необходимо выйти из системы и снова войти в систему, прежде чем изменения членства в группе вступят в силу.

Tratcher 22.05.2018 16:54

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

T-Heron 27.05.2018 17:25
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Поддержка IIS для PHP
Поддержка IIS для PHP
Эта версия PHP требует наличия C++ Redistributable для VS 2019 (как минимум)
7
6
1 803
0

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