【问题标题】:Difference in ASP.Net impersonation methodsASP.Net 模拟方法的区别
【发布时间】:2012-11-08 02:02:36
【问题描述】:

在这个 MSDN article 关于“如何在 ASP.NET 应用程序中实现模拟”中,他们列出了 4 种不同的方法来更改用于执行 Web 请求的帐户。不幸的是,它没有描述这些替代方案之间的差异。

我正在尝试模拟经过 IIS 身份验证的用户从他们的本地计算机上复制一些文件。当我使用 WIN32 api LogonUserA 并模拟特定用户时,它可以工作。但我需要 webapp 与许多用户一起工作(我没有可以访问每个人的文件的帐户)。

我认为简单地设置 Impersonate = "true" 并配置 IIS 应该可以工作,但有些不同。当我检查 Environment.UserName 时,它​​似乎在模拟正确的帐户,但我收到“访问被拒绝”错误。

有人知道这些模拟方法之间的区别吗?是否可以冒充 IIS 认证用户,然后对其进行一些文件操作?

更新:根据我收到的反馈,我需要更清楚自己面临的问题。

环境设置: IIS:禁用匿名身份验证,启用集成 Windows 身份验证 ASP.Net的web.config: authentication mode = "windows", impersonate = true, 拒绝匿名用户

假设我以“userA”的身份访问该页面:

场景 1:模拟 IIS Authenticated 用户

try{
  File.Copy(srcFile, destFile);   // Access Denied even though userA has access to srcFile.
} catch(Exception ex) {
...
}

场景 2:使用 LogonUser 模拟 userA

try{
  // Impersonater is a wrapper around the WIN32 LogonUser API
  using(Impersonater imp = new Impersonator("domain", "userA", "pwd")) 
  {
    File.Copy(srcFile, destFile); // Works
  }
} catch(Exception ex) {
...
}

在这两种情况下,我都在冒充“userA”。

【问题讨论】:

  • 您是否正在尝试将文件从客户端上传到服务器?也许改用 Http Post...
  • 我没有进行任何上传。一切都在 Intranet 上,我只想将文件从客户端计算机移到另一个网络位置。
  • 目前还不太清楚您在哪里遇到拒绝访问错误。您是否尝试过查看安全审核日志以了解正在尝试的内容以及执行该操作的用户?
  • 我在尝试进行文件复制时收到拒绝访问错误。我将更新一些示例代码来说明我的意思。
  • 您是使用直通身份验证 (support.microsoft.com/kb/214806) 还是使用那里的专用帐户?此外,srcFile 在哪里?它不能在映射驱动器上,因为 IIS 根本不支持映射驱动器。

标签: c# asp.net .net iis impersonation


【解决方案1】:

我相信您遇到了here 描述的“双跳”问题。基本上,客户端和 IIS 之间的连接是一跳,IIS 和网络共享之间的连接是第二个,默认情况下不允许模拟双跳。这意味着在您的第一个示例中,用户应该能够访问 IIS 机器的本地资源,但不能访问远程资源。

当以编程方式在 IIS 上输入凭据时,没有第二个跃点。这就是您要寻找的差异。

为了支持您的要求,您需要实现委托而不是模拟。请查看MSDN 了解更多信息。

【讨论】:

  • 这听起来确实像是一个“双跳”问题。
【解决方案2】:

问:有人知道这些模拟方法的区别吗?

答:首先介绍一下 IIS 如何处理请求的背景知识。

有一个特定的系统用户称为 IUSR_computername(IIS6 中的默认值),IIS 服务器使用它来处理文件访问。在 IIS 服务器上运行着一个名为 Aspnet_wp.exe 的进程,该进程在名为 ASPNET 或 NetworkService 的帐户下运行。

因此,当向服务器发出请求时,IIS 会做出反应,如果请求是针对 ASP.NET 应用程序的,它会将请求传递给该进程。

这意味着如果 IIS 服务器设置为使用 IUSR_computername(匿名)访问方法。服务器将使用该帐户来处理请求,如果它发现它是一个 ASP.NET 应用程序,它会将请求传输到 ASP.NET 进程。

默认情况下模拟是禁用的,这意味着当 ASP.NET 进程处理请求时,请求将在 ASPNET 或 NetworkService 帐户下运行。

现在来看看模拟方法之间的区别:

  • 模拟经过 IIS 身份验证的帐户或用户
    使用 IIS 设置使用的帐户。通常是 IUSR_计算机名
    用法:<identity impersonate="true" />

  • 为特定身份启用模拟
    使用指定的特定帐户。
    用法:<identity impersonate="true" userName="accountname" password="password" />

第三个选项是默认状态,即禁用模拟。

问:是否可以冒充 IIS 认证用户,然后对其进行一些文件操作?

答:取决于经过 IIS 身份验证的用户的权限。如果该帐户具有操作文件的权限(Windows 中的 NTFS 权限),则答案是肯定的。

在这里阅读更多:

  1. IIS Authentication
  2. ASP.NET Authentication

【讨论】:

  • 谢谢。我知道如何设置模拟并且知道进程帐户与运行代码的帐户有何不同。我没有看到为什么我在使用 identity impersonate = true 时会出现 Access Denied 错误,但在使用 LogonUserA 时它会起作用。
猜你喜欢
  • 2011-10-09
  • 2017-02-17
  • 2017-08-24
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
相关资源
最近更新 更多