2011-04-09 103 views
5


有人能帮我理解'假冒'的概念吗?帮助理解假冒

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

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

如果已启用,我可以“覆盖”其默认帐户并设置我希望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

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

从一篇非常好的文章ASP.NET Impersonation

+0

感谢您的答复和文章!..这是混淆了我......“当使用模拟,ASP.NET应用程序可以选择与他们的客户的身份执行代表他们正在操作“,所以如果我不使用'模拟'我猜应用程序应该继续使用网站配置帐户执行? (在IIS7中,内置帐户或自定义帐户之一)...在我上面的情况下,如果我不使用模拟,为什么显示'user2'的身份名称我认为它应该仍然是' user1',.. – rauland 2011-04-09 15:03:22

+0

如果您未使用模拟,那么它不会使用IIS内置帐户或自定义帐户之一。 – 2011-04-09 18:07:10