c# - ASP.Net 模拟方法的差异

标签 c# asp.net .net iis impersonation

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

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

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

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

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

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

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

场景 1:模拟 IIS 身份验证用户

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”。

最佳答案

Q: Anyone know the difference between these impersonation methods?

答:首先了解 IIS 如何处理请求的一些背景知识。

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

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

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

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

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

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

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

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

Q: Is it possible to impersonate the IIS authenticated user and then do some file operations with it?

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

在这里阅读更多内容:

  1. IIS Authentication
  2. ASP.NET Authentication

关于c# - ASP.Net 模拟方法的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465833/

相关文章:

c# - 出现在 VS.NET IDE 上的这个符号是什么?

c# - 使用 itextsharp 检索页面上所有单词的各自坐标

c# - 从 IIS 应用程序池运行应用程序

c# - Xamarin 分步向导 android View

c# - .Net MVC 3 中的路由 Controller

c# - 我可以在平面层次结构中组织 Git 子模块吗?

c# - SSRS 2016 Report Viewer V13 工具栏图标不显示

javascript - SignalR 在一段时间后停止工作

c# - 创建后删除文件

.net - 本地主机上使用 DotNetOpenAuth 的 OpenID 提供程序