我从MVC应用程序访问网络共享时遇到问题。
应用程序托管在名为INTRANET的远程计算机上的IIS上,该计算机连接到同一域。
网站正在使用为Network Service
配置的应用程序池。启用了匿名和Windows身份验证。
当我在本地调试应用程序(以管理员身份打开IIS Express和Visual Studio)时,没有问题。我可以访问网络共享并下载文件。
将应用程序发布到INTRANET
后,会出现问题。我打开网络浏览器,转到http://intranet/,使用域凭据登录,然后尝试调用需要访问UNC共享的操作。然后有一个错误:
拒绝访问路径\\ MyServer \ MyShare \ MyFolder
Controller Action看起来像这样:
public ActionResult DownloadAttachment(int id)
{
try
{
using (var ctx = new SyzyfContext())
{
var taskId = ctx.ZgloszeniePlik.Where(zp => zp.ID == id).First().ZgloszenieId;
var file = ctx.ZgloszeniePlik.Where(zp => zp.ID == id).First().nazwa;
var fileLof = file.LastIndexOf(".") + 1;
var fileLen = file.Length;
var fileLofs = file.LastIndexOf(@"\") + 1;
var fileName = file.Substring(fileLofs, fileLen - fileLofs);
var fileToCopy = @"\\Alicja2\Zadania_rep\rep" + id.ToString("D6") + ".fle";
var newFile = @"\\Agata\Repozytorium\" + taskId.ToString() + @"\" + fileName;
if (!Directory.Exists(@"\\Agata\Repozytorium\" + taskId.ToString()))
{
Directory.CreateDirectory(@"\\Agata\Repozytorium\" + taskId.ToString());
}
using (var input = new FileStream(fileToCopy, FileMode.Open, FileAccess.Read, FileShare.Read))
{
if (!System.IO.File.Exists(newFile))
{
using (var outputFile = new FileStream(newFile, FileMode.Create))
{
var buffer = new byte[0x10000];
int bytes;
while ((bytes = input.Read(buffer, 0, buffer.Length)) > 0)
{
outputFile.Write(buffer, 0, bytes);
}
}
}
}
byte[] fileBytes = System.IO.File.ReadAllBytes(newFile);
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
}
catch (Exception ex)
{
ViewBag.Message = ex.Message;
return View("Error");
}
}
我想我误解了整个IIS配置。据我所知,为网络服务配置应用程序池时,它始终使用DOMAIN\MACHINE$
帐户(域将其视为计算机对象)。因此,我已将该UNC共享的完全控制权限磨碎到MACHINE$
帐户中。它仍然不起作用。
当用户尝试调用上述操作时,应用程序使用什么登录名?它使用DOMAIN\MACHINE$
帐户还是登录用户的域帐户?