问题描述
我正在开发一个 ASP.NET MVC Web 应用程序。我有一种情况,我想使用应用程序池标识而不是登录的用户标识上传文件。我只想在上传文件时使用应用程序池标识。所有其他地方,我想使用 Logged 用户身份本身。 应用程序托管在两台服务器上,Server1 和 Server2。Shared 文件夹位于 Server1 中。
[HttpPost]
public JsonResult Upload()
{
string fileUniqueName = string.Empty;
try
{
for (int i = 0; i < Request.Files.Count; i++)
{
HttpPostedFileBase file = Request.Files[i];
string fileName = file.FileName;
fileUniqueName = string.Format("{0}_{1}_{2}",Path.GetFileNameWithoutExtension(file.FileName),DateTime.Now.ToString("yyyyMMdd_HHmmss_FFF"),Path.GetExtension(file.FileName));
string tempFileUploadFolderPath = ConfigurationManager.AppSettings["TempFolderPath"];
Directory.CreateDirectory(tempFileUploadFolderPath);
string fileFullpath = Path.Combine(tempFileUploadFolderPath,fileUniqueName);
file.SaveAs(fileFullpath);
}
}
catch(Exception)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return new JsonResult
{
Data = ""
};
}
return new JsonResult
{
Data = fileUniqueName
};
}
我在 web.config 中有以下设置
<authentication mode="Windows" />
<identity impersonate="true" />
任何人都可以帮助重写上面的代码,其中文件上传适用于应用程序池标识而不是登录的用户标识。文件正在上传到托管应用程序的文件夹。
解决方法
阅读文档和实际测试后,我现在可以给你一个详细的答案。
正如您在上一个帖子中提到的,如果非 AD 组中的用户希望能够将文件上传到文件夹,他们需要以应用程序池身份执行上传操作。但是您启用了模拟,因此当您以非 AD 组用户身份登录时,IIS 将使用您登录的帐户覆盖应用程序池标识。如果模拟设置为 false,上传将作为应用程序池标识执行,文件将保存到文件夹中。
但是,如果在整个站点中将 impersonate 设置为 false,则非 AD 用户在其他页面上执行的任何操作也将作为应用程序池标识执行。
所以你可以将整个站点的impersonate设置为true,只有上传页面impersonate为false。只需在IIS中选择视图文件夹,切换到内容视图,选择一个cshtml并右键单击切换到tatures,然后在身份验证中禁用模拟。像这样
一些有用的博客,您可以参考:Users access to disk
使用 Windows 身份验证时,应用程序池标识(例如 IIS Apppool\Site001)用于某些访问,但 Windows 帐户(例如 User1)用于其他访问。这取决于您使用的应用程序或框架的模拟设置。因此,您通常需要授予对应用程序池标识以及需要访问您的站点的每个 Windows 帐户(例如 User1、User2、User99)的访问权限。
,您应该能够使用 web.config 中的 <location>
元素控制每个路径的身份验证设置。
像这样:
<location path="/upload">
<system.web>
<authentication mode="Windows"/>
<identity impersonate="false"/>
</system.web>
</location>