【问题标题】:How to Upload File using Application Pool identity instead of Logged User Identity- ASP.NET MVC Impersonation如何使用应用程序池标识而不是记录的用户标识上传文件 - ASP.NET MVC 模拟
【发布时间】:2021-05-28 13:38:39
【问题描述】:

我正在开发一个 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" />

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

【问题讨论】:

    标签: .net asp.net-mvc iis impersonation applicationpoolidentity


    【解决方案1】:

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

    正如你在上一个帖子中提到的,如果非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)。

    Identiies in IIS

    【讨论】:

    • 感谢您的详细解释。但是我可以通过任何方式禁用特定代码的模拟。还有一个挑战是我想将文件上传到位于另一台服务器中的共享位置域
    • 是的,您可以在代码中使用impersonationContext.Undo()。如果你想多台服务器使用同一个域,你需要使用ARR and LOAD BALANCING
    【解决方案2】:

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

    类似这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多