IsInRole получает новый токен безопасности
Я использую метод IsInRole WindowsPrincipal для проверки членства в группах в приложениях WPF и Winforms. Я создаю идентификационный токен, который может быть для любого пользователя AD (не обязательно пользователя, который фактически вошел в компьютер - в зависимости от того, что я делаю, я не обязательно аутентифицируюсь, я просто использую токен базового информационного уровня (Я думаю, что правильное название для этого - "токен идентичности").
При первом запуске этого кода на определенном компьютере операционная система генерирует маркер идентификации для указанного пользователя. Этот токен затем используется функцией IsInRole для проверки членства в группах. Это быстро, поэтому мне очень нравится. Однако последующие вызовы для создания WindowsIdentity/WindowsPrincipal ссылаются на существующий токен вместо создания нового. Единственный способ узнать, как обновить токен, - это выйти из системы или перезагрузиться (что очищает кэш токена). Кто-нибудь знает лучший способ сброса кэшированных токенов идентичности?
Пример кода C#:
Using System.Security.Principal;
WindowsIdentity impersonationLevelIdentity = new WindowsIdentity("Some_UserID_That_Isn't_Me", null);
WindowsPrincipal identityWindowsPrincipal = new WindowsPrincipal(impersonationLevelIdentity);
If (identityWindowsPrincipal.IsInRole("AN_AD_GROUP")) { ...
VB:
Imports System.Security.Principal
Dim impersonationLevelIdentity = New WindowsIdentity("Some_UserID_That_Isn't_Me", Nothing)
Dim identityWindowsPrincipal = New WindowsPrincipal(impersonationLevelIdentity)
if identityWindowsPrincipal.IsInRole("AN_AD_GROUP") then...
2 ответа
Оказывается, я был неправ. Это кеширование, но, похоже, на стороне AD. В конце концов, после того, как я создаю новый identityWindowsPrincipal, он обновляется до правильного членства в группах.
Не уверен, что это может решить вашу проблему, попробуйте вызвать метод dispose класса WindowsIdentity, прямо или косвенно.
using (WindowsIdentity impersonationLevelIdentity = new WindowsIdentity("Some_UserID_That_Isn't_Me", null))
{
// your code
}