所以我在生产服务器上遇到代码问题,运行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资源管理器中进行身份验证。
答案 0 :(得分:1)
我记得,我在项目中遇到同样的问题,冒充不使用集成模式,该问题的解决方案是添加到我们的web.config:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
但是这种模仿方法并不适用于global.asax方法:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
protected void Application_BeginRequest(object sender, EventArgs e)
希望这也对你有所帮助,因为我不知道这是哪个ISS版本。