有人可以帮我理解“冒充”的概念吗?
我理解的方式是,当模拟发生时,代码代表某些身份执行。
因此,对于网页,只要禁用模拟,网页将始终在其配置的帐户下运行。
如果已启用,我可以“覆盖”其默认帐户并设置我希望运行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()
是同一个用户,即请求该页面的用户。
答案 0 :(得分:1)
使用模拟时,ASP.NET应用程序可以选择使用代表其运行的客户端的标识执行。这样做的通常原因是避免处理ASP.NET应用程序代码中的身份验证和授权问题。相反,您依靠IIS对用户进行身份验证,并将经过身份验证的令牌传递给ASP.NET应用程序,或者,如果无法对用户进行身份验证,则传递未经身份验证的令牌。
来自非常好的文章ASP.NET Impersonation