我们有一个代码可用来为用户提取广告组成员身份。我们这样创建Windows身份:
WindowsIdentity wi = new WindowsIdentity(userPrincipleName);
我们仅在此处输入用户名,而不是uid @ domain格式
代码在Windows Server 2008 R2上的IIS上以及在Windows 7上的VS2010上的开发机器上运行良好。当我从Windows 10上的VS2017启动我们的项目时,它开始从此行中抛出SecurityException并出现错误消息
Logon failure: the user has not been granted the requested logon type at this computer.
该项目是一个ASP.Net MVC2应用程序,我不得不将其迁移到MVC5才能在VS2017 Win10计算机上运行。
在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);
我也尝试过修改IIS Express applicationhost.config以使用我的凭据运行applicationPool。它没有帮助。
任何人都可以帮助我理解代码失败的原因,以及如何停止失败?现在,我不想转向其他解决方案来获得AD组成员身份。