帮助理解冒充

时间:2011-04-09 14:19:19

标签: asp.net impersonation


有人可以帮我理解“冒充”的概念吗?

我理解的方式是,当模拟发生时,代码代表某些身份执行。

因此,对于网页,只要禁用模拟,网页将始终在其配置的帐户下运行。

如果已启用,我可以“覆盖”其默认帐户并设置我希望运行Web应用程序的帐户。

所以,如果我使用IIS7,我有以下内容:
- 标识设置为自定义帐户“user1”的应用程序池 - 一个asp.net网站,其应用程序池设置为上面的一个,并禁用模拟 - 启用Windows身份验证。

我还有以下代码:

IIdentity ii = Thread.CurrentPrincipal.Identity;
       IIdentity iii = Page.User.Identity;

如果我访问该页面,我会被要求提供Windows凭据,我会介绍'user2'凭据。

由于假冒被禁用,我希望IIdentity名称为'user1',而不是'user2'。

有人可以帮我理解发生了什么吗?我想我完全误解了“假冒”的概念。

由于

更新1

我在搜索了一段时间后遇到了这个链接: http://msdn.microsoft.com/en-us/library/aa302377.aspx

似乎有三个IIdentity对象。

HttpContext.Current.User.Identity
Thread.CurrentPrincipal.Identity
WindowsIdentity i2 = WindowsIdentity.GetCurrent();

从我理解的链接:

HttpContext.Current.User.Identity:表示请求页面的当前用户。

Thread.CurrentPrincipal.Identity:当前正在执行该线程的标识。我想这个标识将是当前Web请求运行的标识,它的asp.net角色将定义用户在应用程序中可以做什么和不能做什么。

我想大多数时候HttpContext.Current.User.Identity和Thread.CurrentPrincipal.Identity都是同一个用户,但是对于某些场景我觉得请求页面的用户和Thread.CurrentPrincipal.Identity可能不同

然后是: WindowsIdentity i2 = WindowsIdentity.GetCurrent();

链接说:“WindowsIdentity = WindowsIdentity.GetCurrent(),它返回当前正在执行的Win32线程的安全上下文的标识。”

在进行一些禁用“模拟”的测试后,我发现这是被冒充的身份。

如果我没有模仿,'WindowsIdentity.GetCurrent();'将反映应用程序池中已配置的用户,如果我进行模拟,则身份将更改为我在web.config中设置的身份:

<identity impersonate="true" password="**" userName="****" />

更新2

如果我将web.config设置为: <identity impersonate="true" />

WindowsIdentity.GetCurrent()在用户发出请求时被模拟:

HttpContext.Current.User.Identity
Thread.CurrentPrincipal.Identity
WindowsIdentity.GetCurrent()

是同一个用户,即请求该页面的用户。

1 个答案:

答案 0 :(得分:1)

使用模拟时,ASP.NET应用程序可以选择使用代表其运行的客户端的标识执行。这样做的通常原因是避免处理ASP.NET应用程序代码中的身份验证和授权问题。相反,您依靠IIS对用户进行身份验证,并将经过身份验证的令牌传递给ASP.NET应用程序,或者,如果无法对用户进行身份验证,则传递未经身份验证的令牌。

来自非常好的文章ASP.NET Impersonation