【问题标题】:ASP.NET Impersonation not working on productionASP.NET 模拟不适用于生产
【发布时间】: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。可能是LogonUserADuplicateToken 不起作用。您的代码工作的其他服务器是否面向互联网?要验证用户名和密码,互联网服务器必须能够连接到域的 Active Directory 控制器。抱歉所有问题,只是试图确定可能存在的问题。

标签: asp.net windows-authentication impersonation


【解决方案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 版本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 2019-11-12
  • 2013-07-13
  • 2018-03-15
  • 2016-08-30
  • 2021-05-04
  • 2018-02-22
  • 2015-09-07
相关资源
最近更新 更多