使用ASP.NET设置模拟

Car*_*nke 7 c# asp.net impersonation

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

所以我在Visual Studio 2015中创建了一个新的MVC项目(在Windows 8.1上运行)并选择使用Windows身份验证.一旦应用程序启动并运行(在ISS Express中),我就切换到User1我的机器上(没有Active Directory)并在Internet Explorer中调用该网站(是的,在设置中启用了"集成Windows身份验证").有了这个设置,在用户HttpContext.User.IdentityUser1WindowsIdentity.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到了例外情况"未提供所需的模拟级别,或者提供的模拟级别无效." 有些人声称这个解决了他们的问题: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>
Run Code Online (Sandbox Code Playgroud)

我的项目设置是

  • "匿名身份验证"是 false
  • "Windows身份验证"是 true
  • "管理pipline模式"是 Integrated

有关改变什么的建议,使这个简单的项目按预期工作?

最好的问候,Carsten

Car*_*nke 5

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

GUIWeb.config和 API 的设置如下:

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <deny users="?" />
  </authorization>
  <identity impersonate="true" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

项目属性(F4选择项目后按)“托管管道模式”设置为Classic

在某处,我看到了关于模拟是否HttpClient也应该起作用的讨论。据说,确实如此。好吧,它不适合我。WebClient如果您使用多种 HTTP 方法,那就没有什么乐趣了。所以我改用 RestSharp:

RestClient client = new RestClient(baseUrl);
client.Authenticator = new NtlmAuthenticator();
Run Code Online (Sandbox Code Playgroud)
  • Visual Studio 特别注意:您必须以管理员身份启动 Visual Studio,否则模拟将无法在 IIS Express 上运行!
  • IIS 特别注意:应用程序池必须使用Classic“托管管道模式”。
  • 特别注意(测试时):起初,API 要求我进行身份验证,但实际上不应该。原因很简单:user1我的开发计算机上的用户有另一个密码,然后是user1我的目标计算机上的密码......

我希望这可以帮助别人。