如何使用应用程序池身份而不是记录的用户身份上传文件 - ASP.NET MVC 模拟

问题描述

我正在开发一个 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,然后在身份验证中禁用模拟。像这样 enter image description here

一些有用的博客,您可以参考:Users access to disk

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

Identiies in IIS

,

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

像这样:

<location path="/upload">
  <system.web>
     <authentication mode="Windows"/>
     <identity impersonate="false"/>
  </system.web>
</location>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...