0

我正在开发一个 ASP.NET MVC Web 应用程序。我有一种情况,我想使用应用程序池身份而不是记录的用户身份上传文件。我只想在上传文件时使用应用程序池标识。所有其他地方,我想使用记录的用户身份本身。应用程序托管在两台服务器上,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" />

任何人都可以帮助重写上面的代码,其中文件上传适用于应用程序池身份而不是记录的用户身份。文件正在上传到托管应用程序的文件夹。

4

2 回答 2

2

看完文档和实际测试后,我现在可以给你一个详细的答案。

正如您在上一个线程中提到的,如果非AD组中的用户希望能够将文件上传到文件夹,他们需要以应用程序池身份执行上传操作。但是您启用了模拟,因此当您以非 AD 组用户身份登录时,IIS 将使用您登录的帐户覆盖应用程序池标识。如果 impersonate 设置为 false,则将以应用程序池身份执行上传,并将文件保存到文件夹中。

但是,如果在整个站点中将impersonate设置为false,则非AD用户在其他页面上执行的任何操作也将作为应用程序池标识执行。

所以可以为整个站点设置impersonate为true,只有上传页面impersonate为false。只需选择IIS中的视图文件夹,切换到内容视图,选择一个cshtml并右键单击切换到tatures,然后在身份验证中禁用模拟。像这样 在此处输入图像描述

一些有用的博客你可以参考:用户访问磁盘

使用 Windows 身份验证时,应用程序池标识(例如 IIS Apppool\Site001)用于某些访问,但 Windows 帐户(例如 User1)用于其他访问。这取决于您正在使用的应用程序或框架的模拟设置。因此,您通常需要授予对应用程序池身份的访问权限,以及需要访问您的站点的每个 Windows 帐户(例如 User1、User2、User99)。

IIS 中的身份

于 2021-03-01T08:34:35.947 回答
1

您应该能够使用<location>web.config 中的元素控制每个路径的身份验证设置。

像这样的东西:

<location path="/upload">
  <system.web>
     <authentication mode="Windows"/>
     <identity impersonate="false"/>
  </system.web>
</location>
于 2021-03-07T16:26:07.713 回答