3

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

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

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

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

更新:根据我收到的反馈,我需要更清楚地了解我所面临的问题。

环境设置:IIS:禁用匿名身份验证,启用集成windows身份验证ASP.Net的web.config:身份验证模式=“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”。

4

2 回答 2

3

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

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

IIS 服务器使用一个特定的系统用户 IUSR_computername IIS6 中的默认值)来处理文件访问。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 认证用户,然后对其进行一些文件操作?

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

在这里阅读更多:

  1. IIS 身份验证
  2. ASP.NET 身份验证
于 2012-11-20T04:22:21.863 回答
2

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

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

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

于 2012-11-21T03:34:16.357 回答