【问题标题】:Set up impersonation with ASP.NET使用 ASP.NET 设置模拟
【发布时间】:2017-01-27 01:24:27
【问题描述】:

首先,我创建了一个非常简单的项目,它试图计算两个目录中的文件数。不允许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
  • “托管管道模式”为Integrated

有什么建议可以让这个简单的项目按预期工作吗?

最好的问候, 卡斯滕

【问题讨论】:

    标签: c# asp.net impersonation


    【解决方案1】:

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

    GUI 和 API 的 Web.config 获得了以下设置:

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

    项目属性(选择项目后按F4)“Managed pipline mode”设置为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...

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

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 2011-12-28
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      相关资源
      最近更新 更多