为了初步了解,我创建了一个非常简单的项目,它试图计算两个目录中的文件数。不允许User1
访问Directory2
,并且User2
不允许访问Directory1
。由于模仿,我应该只获得一个号码,具体取决于调用我的应用程序的用户。两个用户都设置为管理员。
所以我在Visual Studio 2015中创建了一个新的MVC项目(在Windows 8.1上运行)并选择使用Windows身份验证。一旦应用程序启动并运行(在ISS Express中),我切换到我的机器上的User1
(没有Active Directory)并在Internet Explorer中调用该网站(是的,“集成Windows身份验证”在设置)。使用此设置,HttpContext.User.Identity
中的用户为User1
,WindowsIdentity.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
true
Integrated
有关更改内容以使此简单项目按预期工作的任何建议吗?
祝你好运, 卡斯滕
答案 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();
Classic
“托管管道模式”。user1
有另一个密码,然后是目标计算机上的user1
... 我希望这有助于某人。