使用 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
中的用户是 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();
}
}
不幸的是,我得到了异常 "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>
我的项目设置是
- "Anonymous authentication" 是
false
- "Windows authentication" 是
true
- "Managed pipline mode" 是
Integrated
关于如何改变以使这个简单的项目按预期工作有什么建议吗?
此致,
卡斯滕
我终于让它工作了(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
...
我希望这对某人有所帮助。
为了初步了解,我创建了一个非常简单的项目,它试图计算两个目录中的文件数。 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
中的用户是 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();
}
}
不幸的是,我得到了异常 "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>
我的项目设置是
- "Anonymous authentication" 是
false
- "Windows authentication" 是
true
- "Managed pipline mode" 是
Integrated
关于如何改变以使这个简单的项目按预期工作有什么建议吗?
此致, 卡斯滕
我终于让它工作了(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
...
我希望这对某人有所帮助。