【问题标题】:.Net unauthorized access exception after deployment.Net 部署后未授权访问异常
【发布时间】:2016-05-11 14:57:59
【问题描述】:

我将内部 Web 应用程序部署到服务器 A 并在服务器 B 上的网络驱动器上创建文件时出错。如果我在本地运行,则文件已成功创建在服务器 B 上。

System.UnauthorizedAccessException:对路径“\\b\folder\test.pdf”的访问被拒绝。

应用程序池的标识是networkservice。我让 networkservice 完全控制服务器 B 上的目标文件夹。我什至给了Everyone 完全控制,但它仍然出现错误。

服务器 A 运行 .NET 7.5。创建文件的代码:

var byteArray = generateArray();
var destination = "\\\\b\\folder\\test.pdf";
try {
    var destinationFile = new FileInfo(destination);
    if (destinationFile.Exists) {
        destinationFile.Delete();
    }
    System.IO.File.WriteAllBytes(destination, byteArray);
} catch (UnauthorizedAccessException) {
    //
}

我看到有人遇到了完全相同的问题here。但它并没有解决我的问题。

解决方案: 我将身份更改为管理员帐户,而不是使用 network service 作为应用程序池。它有效,但我不完全理解它为什么有效。因为A上的网络服务和B上的不同?

【问题讨论】:

  • 您是否尝试冒充服务器 B 的用户或管理员?
  • Network Service 对于每台服务器都是唯一的,因此一台机器上的Network Service 与另一台机器上的不同。然而,这无关紧要。 Network Service 实际上正在做一些完全不同的事情。当应用程序池以Network Service 运行时,它实际上是针对 Active Directory 身份验证中的 机器名称 进行身份验证的。所以如果你的机器被命名为WEB1,那么它会针对$WEB1进行身份验证

标签: c# asp.net exception iis-7.5


【解决方案1】:

即使您向所有人提供了访问权限,某些应用程序也必须获得特定权限。这是 Window 的 Vista 中引入的 UAC 系统的一部分。此举是为了提高安全性,因此应用程序无法在任何用户下运行,并且基本上具有完全访问权限。

你应该做的是,对目录提供以下访问权限:

IIS AppPool\NameOfAppPool

这将为您的托管 Web 应用程序提供对该目录的特定访问权限,因为 IIS 将能够正确操作该目录。您可以在编写或阅读之前实施一些代码来帮助验证,这些代码是:

public static bool ValidateIOPermission(string path)
{
     try
     {
          if(Directory.Exist(path))
               return true;

          else { Directory.CreateDirectory(path); }
     }

     catch(Exception ex) { return false; }
}

上面的代码是一个小例子,基本上是尝试执行动作并捕获异常,这样你就知道你是否有访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多