使用ASP.NET设置模拟

时间:2016-09-19 11:08:59

标签: 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.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();
    }
}

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

我的项目设置是

  • “匿名身份验证”为false
  • “Windows身份验证”为true
  • “托管pipline模式”为Integrated

有关更改内容以使此简单项目按预期工作的任何建议吗?

祝你好运,    卡斯滕

1 个答案:

答案 0 :(得分:3)

我终于设法让它工作(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)“管理的pipline模式”设置为Classic

在某处,我看到了关于模仿是否也适用于HttpClient的讨论。有人说,确实如此。好吧,它不适合我。如果您使用各种HTTP方法,WebClient并不好玩。所以我切换到RestSharp:

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

我希望这有助于某人。