WindowsIdentity.GetCurrent()。Impersonate()做什么

时间:2011-11-09 22:24:34

标签: c# .net

我正在编写一个类来处理在asp.net,WCF服务和WinForms应用程序中使用的模拟和委派。

Per MSDN,WindowsIdentity.GetCurrent()返回一个代表当前Windows用户的WindowsIdentity对象。

Per MSDN,WindowsIdentity.Impersonate允许代码模拟其他Windows用户。

那么,冒充当前用户有什么影响,更重要的是,在Web应用程序中,WindowsIdentity.GetCurrent()如何返回除流程入门者身份或已模拟的最终用户以外的其他用户?

2 个答案:

答案 0 :(得分:7)

如果发生Win32错误,

Impersonate()会抛出SecurityException。因此,它很可能是通过Win32函数实现的,很可能是ImpersonateLoggedOnUser()

它的文件说(强调我的):

  

所有模拟功能,包括ImpersonateLoggedOnUser允许   如果满足下列条件之一,则要求假冒:

     
      
  • 令牌的请求模拟级别小于SecurityImpersonation,例如SecurityIdentification或   SecurityAnonymous
  •   
  • 来电者拥有SeImpersonatePrivilege权限。
  •   
  • 进程(或调用方登录会话中的其他进程)使用显式凭据通过LogonUser创建令牌或   LsaLogonUser功能。
  •   
  • 经过身份验证的身份与来电者相同。
  •   

因此,我强烈倾向于认为WindowsIdentity.GetCurrent().Impersonate()将成功为同一用户建立新的模拟层。

关于问题的第二部分,您似乎将WindowsIdentity.GetCurrent()HttpContext.User混为一谈。在Web应用程序中,WindowsIdentity.GetCurrent()始终返回线程所有者(通常为Network Service),HttpContext.User返回当前经过身份验证的用户(如果有)。

答案 1 :(得分:0)

如果您必须通过多个应用程序运行用户,当前用户也很重要,包括通常允许匿名访问的应用程序。此外,它允许您明确地执行在某些类型的应用程序中隐式执行的操作。

从您的角度来看,更重要的是要了解并非所有应用程序类型都以您希望的方式自动获取启动用户类型。在这些情况下,在某些情况下,您可以通过编程方式完成获取身份,然后以自己的方式使用它(恶意或其他?)。

就模仿另一个用户而言,当你超出某些声明性情境(比如ASP.NET模拟)时,这会变得很有趣。这是有充分理由的,所以黑客不会像上帝那样创造一个像权利一样的应用程序。