WindowsIdentity.WindowsIdentity(userPrincipleName)在某些计算机上引发SecurityException

时间:2018-11-28 17:13:06

标签: .net securityexception windows-identity

我们有一个代码可用来为用户提取广告组成员身份。我们这样创建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组成员身份。

0 个答案:

没有答案