[英]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 中的文件共享具有两组定义用户可以执行的操作的权限:
确保共享权限和文件系统权限都允许用户访问。 文件系统权限可能允许某人完全控制,但共享权限拒绝他们任何访问。 在这种情况下,他们可以在本地访问和修改任何文件,但无法通过共享执行任何操作。
我通常会将共享权限设置为对所有人读/写,然后使用文件系统权限来限制访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.