繁体   English   中英

用户模拟在 .NET Core 中不起作用

[英]User Impersonation not working in .NET Core

我们有一个 web 应用程序在我们公司的 intr.net 上运行。 当我尝试访问我的 MVC controller 中的 a.network 路径时出现以下错误:

对路径“\Server001\SharedFiles\CA”的访问被拒绝。

该应用程序托管在 IIS 上,应用程序池设置为 ApplicationPoolIdentity。 我不想使用有权访问所有目录的帐户来设置它。 我希望每个用户只能访问他们被允许访问的文件夹。 经过一些研究,我认为唯一的方法是在需要时以编程方式模拟用户。 为了对此进行测试,我创建了一个新的 ASP.NET Core 6 MVC 项目,并将身份验证设置为 Windows(还在 IIS 站点中启用了 Windows 身份验证)。 然后我将以下代码添加到我的 controller 中:

public async Task<IActionResult> Index()
{
    // The user used as Log On as for the Windows Service
    var serviceUser = WindowsIdentity.GetCurrent();
    // returns "IIS APPPOOL\MvcTest"

    // The user to be impersonated
    // COMPANYDOMAIN\MyName
    var userToImpersonate = (WindowsIdentity)HttpContext.User.Identity;

     await WindowsIdentity.RunImpersonatedAsync(userToImpersonate.AccessToken, async () =>
      {
        var ImpersonatedUser = WindowsIdentity.GetCurrent();

        _logger.LogInformation(ImpersonatedUser.ImpersonationLevel.ToString());
        //  returns "impersonate"
        _logger.LogInformation(ImpersonatedUser.Name);
        //  Here we are getting "COMPANYDOMAIN\MyName"

        try
        {
            var files = Directory.GetFiles("\\\\Server001\\SharedFiles\\CA");
            return View(files);
        }
        catch (Exception ex) { }
    });
}

虽然这表明WindowsIdentity.GetCurrent().Name已更改为我的域帐户(我登录的帐户),但由于某种原因它不接受模拟用户。 我仍然收到拒绝访问错误。 这是权限问题吗?

我可以使用我的域帐户 (COMPANYDOMAIN\MyName) 浏览“\Server001\SharedFiles”,而且当我将应用程序池标识更改为我的域帐户时,该应用程序仍然有效。

如果WindowsIdentity.GetCurrent().Name显示正确的用户,则您的模拟可能正常工作。

Windows 中的文件共享具有两组定义用户可以执行的操作的权限:

  1. 共享权限。 这定义了允许谁远程访问该文件夹。 这些设置在您最初设置共享的同一位置。
  2. 文件系统权限。 这些是您会想到的正常文件权限。

确保共享权限和文件系统权限都允许用户访问。 文件系统权限可能允许某人完全控制,但共享权限拒绝他们任何访问。 在这种情况下,他们可以在本地访问和修改任何文件,但无法通过共享执行任何操作。

我通常会将共享权限设置为对所有人读/写,然后使用文件系统权限来限制访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM