【发布时间】:2013-04-24 01:55:10
【问题描述】:
所以我在运行 Windows Server 2003 和 IIS 6 的生产服务器上遇到了代码问题。
我正在尝试模拟一个域帐户,这在本地可以正常工作。
虽然当它在服务器上时,函数模拟用户失败,即返回 false:
private bool impersonateValidUser(String userName, String domain, String password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf())
{
if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}
if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}
请注意,代码不会崩溃 - 它只是返回 false。以前有没有人经历过这种情况并且对我应该开始看什么有任何想法?我假设 IIS 配置在这里起作用,但可能需要数周时间才能找到导致此问题的小问题。
我可以使用我试图模拟的帐户在服务器上安装驱动器,这样帐户用户/密码组合就可以了,并且可以用于在 Windows 资源管理器中进行身份验证。
【问题讨论】:
-
请问哪个版本的 IIS 和 Windows Server?请注意,您必须执行各种步骤来允许委派,人们忘记做的最常见的事情是允许“权限”服务器本身在 Active Directory 中进行委派。有关概述,请参阅 support.microsoft.com/kb/810572。
-
2003 和 IIS 6 - 很好,我也会添加到问题中。
-
@dash 该网站通常不使用 Windows 模拟,因为它是面向外部的 - 但我使用它进行一次性身份验证以从共享驱动器中取回文件。
-
你知道哪条线路不工作吗?此外,出于验证的目的,您只需要 LogonUserA?您只需要知道用户名和密码是否有效,而不是它们是否可以被冒充?
-
你需要知道哪一行:-)。如果可能,添加一些日志记录,因为有几个
if语句可能会返回 false。可能是LogonUserA或DuplicateToken不起作用。您的代码工作的其他服务器是否面向互联网?要验证用户名和密码,互联网服务器必须能够连接到域的 Active Directory 控制器。抱歉所有问题,只是试图确定可能存在的问题。
标签: asp.net windows-authentication impersonation