有人可以帮我理解“假冒”的概念吗?
据我了解,当模拟发生时,代码将以某种身份执行。
因此,对于网页,只要禁用模拟,该网页将始终在其配置的帐户下运行。
如果启用了该功能,则可以“覆盖”其默认帐户,然后设置要在其中运行Web应用程序的帐户。
因此,如果我使用的是IIS7,并且具有以下内容:
-标识设置为自定义帐户“user1”的应用程序池。
-一个asp.net网站,其应用程序池设置为上述一个,并且禁用了模拟。
-启用Windows身份验证。
我也有以下代码:
IIdentity ii = Thread.CurrentPrincipal.Identity;
IIidentity 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();”将反射(reflect)应用程序池中已配置的用户,如果我进行了模拟,则该身份将更改为我在web.config中设置的用户:<identity impersonate="true" password="**" userName="****" />
更新2
如果我将web.config设置为:<identity impersonate="true" />
WindowsIdentity.GetCurrent()在用户发出请求时被模拟,因此:
HttpContext.Current.User.Identity
Thread.CurrentPrincipal.Identity
WindowsIdentity.GetCurrent()
是同一用户,该用户正在请求页面。
最佳答案
使用模拟时,ASP.NET应用程序可以选择使用代表其运行的客户端身份执行。这样做的通常原因是避免处理ASP.NET应用程序代码中的身份验证和授权问题。而是,您依靠IIS对用户进行身份验证,然后将经过身份验证的 token 传递给ASP.NET应用程序,或者,如果无法对用户进行身份验证,则传递未经身份验证的 token 。
来自很好的文章ASP.NET Impersonation
关于asp.net - 帮助理解模仿,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5605566/