WindowsIdentity.WindowsIdentity (userPrincipleName), вызывающий исключение SecurityException на некоторых компьютерах - PullRequest
0 голосов
/ 28 ноября 2018

У нас есть код, который мы используем для извлечения членства в AD Group для пользователя.Мы создаем идентификатор Windows следующим образом:

WindowsIdentity wi = new WindowsIdentity(userPrincipleName);

Мы вводим там только имя пользователя, а не в формате uid @ domain

Код отлично работает на IIS через Windows Server 2008 R2и наши машины для разработки на VS2010 через Windows 7. Когда я запустил наш проект из VS2017 для Windows 10, он начал выдавать исключение SecurityException из этой строки с сообщением об ошибке

Logon failure: the user has not been granted the requested logon type at this computer.

Проект является приложением ASP.Net MVC2и мне пришлось перенести его в MVC5 для запуска на компьютере Win10 VS2017.

На Win10 я пробовал ту же строку кода с параметром uid @ domain, а также пробовал с UserPrincipal.UserPrincipalName.Оба выдавали одну и ту же ошибку.

Я перенес проект из .Net 4.0 в .Net 4.5.1, так что я могу загрузить и отладить код инфраструктуры ниже.На обеих машинах, т. Е. Win7 и Win10, в выводе отладки появляются следующие строки:

Exception thrown: 'System.Security.AccessControl.PrivilegeNotHeldException' in mscorlib.dll
The process does not possess the 'SeTcbPrivilege' privilege which is required for this operation.

Итак, я надеюсь, что я не ошибаюсь, и ниже приведен код из класса WindowsIdentity, функция KerbS4ULogon:

try {
    // Try to enable the TCB privilege if possible
    try {
        privilege = new Privilege("SeTcbPrivilege");
        privilege.Enable();
    }
    catch (PrivilegeNotHeldException) { }

    IntPtr dummy = IntPtr.Zero;
    status = Win32Native.LsaRegisterLogonProcess(ref Name, ref logonHandle, ref dummy);
    if (Win32Native.ERROR_ACCESS_DENIED == Win32Native.LsaNtStatusToWinError(status)) {
        // We don't have the Tcb privilege. The best we can hope for is to get an Identification token.
        status = Win32Native.LsaConnectUntrusted(ref logonHandle);
    }
}
catch {
    // protect against exception filter-based luring attacks
    if (privilege != null)
        privilege.Revert();
    throw;
}
finally {
    if (privilege != null)
        privilege.Revert();
}
if (status < 0) // non-negative numbers indicate success
    throw GetExceptionFromNtStatus(status);

Я думаю, catch (PrivilegeNotHeldException) все равно срабатывает.Тогда оно падает до Win32Native.LsaRegisterLogonProcess.Либо это терпит неудачу и переходит к следующему блоку:

if (Win32Native.ERROR_ACCESS_DENIED == Win32Native.LsaNtStatusToWinError(status)) {
    // We don't have the Tcb privilege. The best we can hope for is to get an Identification token.
    status = Win32Native.LsaConnectUntrusted(ref logonHandle);
}

, где мы получаем «отрицательное» значение состояния, или сам Win32Native.LsaRegisterLogonProcess возвращает отрицательное возвращаемое значение, которое не равно Win32Native.ERROR_ACCESS_DENIED,

Это приводит к тому, что следующие строки вызывают исключение SecurityException:

if (status < 0) // non-negative numbers indicate success
    throw GetExceptionFromNtStatus(status);

Я также попытался изменить applicationhost.config IIS для запуска applicationPool с использованием моих учетных данных.Это не помогло.

Может кто-нибудь помочь мне понять, почему код не работает, и как я могу остановить его?Пока я не хочу переходить на альтернативные решения, чтобы получить членство в группе AD.

...