【问题标题】:Writing to a network location in ASP.NET (using AD)写入 ASP.NET 中的网络位置(使用 AD)
【发布时间】:2009-09-11 14:32:00
【问题描述】:

我遇到了一个(希望是)小问题。我有一个用 ASP.NET 编写的 Web 应用程序,它将在使用 IIS 6.0 的 Windows 2003 Server 机器上运行。当我在本地运行它时,它运行良好。当我从服务器运行它时,该站点工作正常。问题在于写入远程文件夹。我有一个使用应用程序写入的 AD 权限的网络文件夹。使用我的 AD 帐户(当我在本地编写时)它可以正确地进行身份验证,但是在使用 IIS 帐户时它不会。有没有人遇到过这个?有没有可用的解决方案?

到目前为止,我已尝试将我的 AD 帐户用作站点运行的 IIS 中的“访客帐户”,但这仍然不起作用。

任何想法、解释或建议将不胜感激!

谢谢。

【问题讨论】:

  • 在 IIS 中运行应用程序池的用户的身份是什么?默认用户(网络服务)没有网络权限,因此无法写入网络文件共享。
  • 我的域帐户可以访问运行应用程序池的网络文件夹。

标签: asp.net iis active-directory


【解决方案1】:

默认情况下,ASP.NET 在本地用户帐户的上下文中运行,该帐户无权访问您的 AD 计算机。您可以重新配置连接池以作为域帐户运行,然后它就可以访问了。您应该尽可能少地授予域帐户权限,并将其添加到 IIS 机器上的 IIS_WPG 并授予它在该框上作为服务运行的权限。

【讨论】:

    【解决方案2】:

    我通常处理这些情况的方法是执行几个步骤。

    • 在 AD 中为服务创建一个帐户。
    • 将此帐户添加到您要访问的网络共享中。
    • 然后让您的 ASP.Net 应用程序使用该服务帐户而不是本地 IIS 帐户运行。
    • 在您的 web.config 文件中,将以下行放在

      <system.web>
      <identity impersonate="true"/>
      </system.web>

    【讨论】:

    • 嗯...我在 AD 中创建了帐户,并添加了共享所需的权限。我将应用程序池用户从“网络服务”更改为新的 AD 用户。我也将允许匿名帐户更改为 AD 用户帐户。 web.config 文件也已更改。它不会写入该文件夹。有什么想法吗?!
    • 请确保该设置适用于您的应用程序,而不是 IIS 的顶层。此外,在目录安全 -> 身份验证和访问控制 -> 编辑 - 确保选中集成 Windows 身份验证。
    • 还有一件事要确保,所有错误都被写入某个日志。通常,当它无法写入时,它会抛出一个错误,其中包含一些可能会有所帮助的信息。
    【解决方案3】:

    可能与运行应用程序池的帐户有关吗?

    【讨论】:

      【解决方案4】:

      您也可以考虑按照此 SO 答案中的建议进行操作:

      ASP.NET Windows Authentication Impersonate Problem

      将正在写入的代码包装到远程位置,其他所有内容都可以单独处理。这将为您的 Web 应用程序提供最佳安全性,因为您只是模拟一个帐户,为需要它的代码而不是所有代码写入这些写入。

      【讨论】:

      • 看那是我的答案... grin 如果可能的话,我不会那样做,因为(a)在这种情况下它不起作用并且( b)要使其工作,您需要硬编码域帐户的用户名和密码以切换上下文。哪个不好。
      • 嗯,那个答案中的模拟需要windows auth,问的人说他把它切换到测试,而不是永久设置
      • Gotcha.... 我以为你的意思是有一个真正的限制,因为它实际上不起作用。我们已经按照其他人的说明在 web.config 和应用程序的连接池中设置模拟,但我认为您的方式很巧妙,因为它确实将安全性限制在该操作中。我同意硬编码的用户名/密码很糟糕。 :)
      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2016-03-04
      • 2015-05-26
      相关资源
      最近更新 更多