У нас есть код, который мы используем для извлечения членства в 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.