ASP.NET 核心系统。未经授权访问异常:访问路径"C:\..."被拒绝



我是 ASP.NET 核心的新手,所以我正在尝试制作API。我正在尝试通过我的 Web API 上传图片。图片将保存到 Web 服务器上。我在Windows Server 2016标准版VPS机器上运行API。我在计算机上安装了 IIS 10。我得到的错误(远程调试时):

{System.UnauthorizedAccessException: 对路径 'C:\HomeNET\Houses\13' 的访问被拒绝。 at System.IO.Win32FileStream..ctor(字符串路径、文件模式模式、文件访问访问、文件共享共享、Int32 缓冲区大小、文件选项选项、文件流父级) at System.IO.Win32FileSystem.Open(字符串完整路径、文件模式模式、文件访问访问、文件共享共享、Int32 缓冲区大小、文件选项选项、文件流父级) at System.IO.FileStream.Init(字符串路径、文件模式模式、文件访问访问、文件共享共享、Int32 缓冲区大小、文件选项选项) 在System.IO.FileStream..ctor(字符串路径,文件模式) at HomeNetAPI.Controllers.HouseController.d__6.MoveNext() in C:\Users\okuhl\Documents\HomeNet\Web API\HomeNetAPI\src\HomeNetAPI\Controllers\HouseController.cs:line 83}

这很奇怪,因为如果目录不存在,则会创建目录。下面是一些发生失败的代码:

if (resultHouse != null)
{
if (!Directory.Exists($"C:/HomeNET/Houses/{resultHouse.HouseID}"))
{
Directory.CreateDirectory($"C:/HomeNET/Houses/{resultHouse.HouseID}");
}
String fileName = new FileInfo(imageFile.FileName).Name;
String fileExtension = new FileInfo(imageFile.FileName).Extension;
using (var fileStream = new FileStream($"C:/HomeNET/Houses/{resultHouse.HouseID}", 
FileMode.Create)) //Bombs out after this line
{
var result = imageFile.CopyToAsync(fileStream);
if (result.IsCompleted)
{
newHouse.HouseImage = Path.Combine($"C:/HomeNET/Houses/{resultHouse.HouseID}", $".{fileExtension}");
var updateResult = await Task.Run(() =>
{
return houseRepository.UpdateHouse(newHouse);
});
if (updateResult != null)
{
response.DidError = false;
response.Message = $"House {newHouse.Name} has been created successfully! Invite friends ad family to your house!";
response.Model = newHouse;
return Ok(response);
}
else
{
response.DidError = true;
response.Message = "Something went wrong with creating the house. Please try again";
response.Model = newHouse;
return BadRequest(response);
}
}
else
{
response.DidError = true;
response.Message = $"Something Went wrong with creating your house. House image could not be saved onto the system. n {result.Exception.Message}";
response.Model = newHouse;
return BadRequest(response);
}
}
}

我尝试使该文件夹可供所有人使用,但没有奏效。我还尝试授予我的 AppPool 修改文件夹的权限,但这不起作用。

就我而言(IIS 8.5),我必须将IIS_IUSRS添加到应用程序文件夹中才能解决此问题

尝试检查运行应用程序池的用户(此处的说明:https://learn.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities)。

如果该用户无权访问 C 驱动器,则写入将失败。

(另外:尽量不要在代码中一次又一次地对路径进行编码。将C:/HomeNET/Houses/声明为 const 并以这种方式引用它,或者更好的是,从 web.config 中读取它)

您需要创建一个虚拟目录。 以下是在 IIS 7 中执行此操作的方法:https://technet.microsoft.com/en-us/library/cc771804(v=ws.10).aspx 。 对于 IIS 10,它可能类似。

为服务正在使用的文件夹/文件提供网络服务权限

右键单击您的文件夹 -> poperty 的 -> 安全性 ->编辑 -> 添加 -> 类型 :网络服务 ->复选框 完全控制 允许-> 按确定或应用

我遇到了这篇文章,因为我也遇到了FileUpload逻辑上的错误。但是,我正在IISExpress下运行正在开发的代码。我从获取IWebHostEnvironment变量并将其分配给构造函数中控制器类中的一个变量开始代码 - 然后阅读了一些让我认为它应该来自Appdomain.CurrentDomain.BaseDirectory - 这是我如何得到错误的根源 - BaseDirectory信息的来源相当过时 - 我去那里的错 - webHostEnvironment确实是我需要的来源。

我使用了AppDomain.CurrentDomain.SetData("uploadDirName",path) - 这样我就可以在文件发布实际发生时将其拉回(会话状态的想法)。使用此方法后,权限没有文件异常。

path = Path.Combine(_webHostEnvironment.WebRootPath, "UploadedFiles");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
AppDomain.CurrentDomain.SetData("UploadPath", path);

并在 POST 逻辑中将其拉回

path = Path.Combine(
AppDomain.CurrentDomain.GetData("UploadPath").ToString(), file.FileName); 
using (var stream = new FileStream(path,
FileMode.Create))
{
await file.CopyToAsync(stream);
}

传递数据的另一个选项是会话数据 - 但此选项很方便并且目前确实有效。

暗示问题中需要一个单独的目录 - 这种类型的问题 - 是我发现的安全问题,需要为应用程序池的服务帐户授予对该文件夹的修改权限。随着发展随着时间的推移而变化,这可能会在以后出现。

最新更新