使用 ASP.NET 设置模拟

Set up impersonation with ASP.NET

为了初步了解,我创建了一个非常简单的项目,它试图计算两个目录中的文件数。 User1 不允许访问 Directory2 并且 User2 不允许访问 Directory1。由于模拟,我应该只能得到一个号码,具体取决于调用我的应用程序的用户。两个用户都设置为管理员。

所以我在 Visual Studio 2015 年(运行 on Windows 8.1)创建了一个新的 MVC 项目,并选择使用 Windows 身份验证。一旦应用程序启动 运行(在 ISS Express 中),我在我的机器上切换到 User1(没有 Active Directory)并在 Internet Explorer 中调用该网站(是的,"Integrated Windows authentication"在设置中启用)。使用此设置,HttpContext.User.Identity 中的用户是 User1WindowsIdentity.GetCurrent() 是我的开发用户,我在 Visual Studio.

中与之合作的用户

我也试过手动模拟:

WindowsIdentity winId = (WindowsIdentity)User.Identity;
WindowsImpersonationContext ctx = null;
try
{
    ctx = winId.Impersonate();

    // GetNumbers() tries to get the number of files for both directories       
    numbers = GetNumbers();
}
catch (Exception e)
{
}
finally
{
    if (ctx != null)
    {
        ctx.Undo();
    }
}

不幸的是,我得到了异常 "Either a required impersonation level was not provided, or the provided impersonation level is invalid." 有些人声称这个解决了他们的问题:https://kc.mcafee.com/corporate/index?page=content&id=KB56194 不适合我。我已将 User1 和我自己的用户添加到列表中并重新启动计算机。没有变化。

唯一让我有点希望的是使用单独登录的模拟,如https://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingusinglogonuser所述缺点非常明显:我必须有用户密码,为什么我要登录如果用户已经为我做了,请再次。

虽然这是一个新项目,我没有进行重大更改,但更多信息仅供完整性检查...

我的Web.config

<authentication mode="Windows" />
<authorization>
  <deny users="?" />
</authorization>

我的项目设置是

关于如何改变以使这个简单的项目按预期工作有什么建议吗?

此致, 卡斯滕

我终于让它工作了(IIS Express 和 IIS)!如上所述,第一种方法只是一个原型。最终目标是创建一个在服务器 A 上运行的 GUI 和一个在服务器 B 上运行的 API。两者都使用 ASP.NET.

实现

GUI 的 Web.config 和 API 得到了这些设置:

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <deny users="?" />
  </authorization>
  <identity impersonate="true" />
</system.web>

项目属性(选择项目后按F4)"Managed pipline mode"设置为Classic

在 SO 的某个地方,我看到了关于模拟是否也应该与 HttpClient 一起工作的讨论。据说,确实如此。好吧,它不适合我。如果您使用多种 HTTP 方法,WebClient 就没有意思了。所以我切换到 RestSharp:

RestClient client = new RestClient(baseUrl);
client.Authenticator = new NtlmAuthenticator();
  • Visual Studio 的特别说明:您必须 Visual Studio 以管理员身份启动,否则模拟将无法在 IIS Express 上运行!
  • IIS特别说明:应用程序池必须使用Classic "Managed pipeline mode".
  • 特别说明(测试时):起初,API 要求我进行身份验证,但它不应该这样做。原因很简单:我的开发机器上的用户 user1 有另一个密码,然后我的目标机器上的 user1...

我希望这对某人有所帮助。