是否可以将“impersonate”函数与字符串(用户名)而不是intptr一起使用?

时间:2009-06-09 18:15:12

标签: asp.net vb.net authentication

System.Security.Principal.WindowsIdentity.Impersonate函数采用System.intptr参数,这在我的情况下似乎非常无用(我的理解有限)。

我正在开发一个内部网应用程序,该应用程序使用集成安全性逐页授权用户与其Windows身份相关联的角色。我没有密码或任何类似的东西。只需一个Windows用户名。出于测试目的,我怎么可能基于用户名冒充Windows用户?

提前致谢:)

4 个答案:

答案 0 :(得分:3)

简而言之,不。但是你走在正确的轨道上。您必须通过使用LoginUserA(C Win32 Api)模拟登录或将IIS站点设置为Windows身份验证来获取用户。

在这种情况下,您的Page将具有名为User的IPrincipal类型的属性,然后您可以使用该属性作为该用户运行。例如(抱歉,C#代码)。

IPrincipal p = this.User;
WindowsIdentity id = (WindowsIdentity)p.Identity;
WindowsImpersonationContext wic = id.Impersonate();
try {
    // do stuff as that user
}
finally {
     wic.Undo();
}

答案 1 :(得分:1)

您是否正在使用WindowsPrincipal中特定于Windows的任何内容,还是只需一种方便的方式来获取auth / auth而无需管理用户?如果你需要基于Windows,Serapth有正确的方法。如果您只是将它用作方便的auth / auth存储,那么您应该编写代码以与IPrincipal接口。然后,您可以将自己的IPrincipal实现注入HttpContext.User或Thread.CurrentThread.Principal,具体取决于测试和应用程序的性质。

答案 2 :(得分:0)

用户令牌(Impersonate中IntPtr表示的值)代表的用户名不仅仅是用户名。它们是内部窗口上下文的句柄,包括有关用户,身份验证令牌,当前安全权限等的信息。正因为如此,您无法在没有密码的情况下进行模拟。您必须实际“登录”才能通过LogonUser method创建令牌。

我过去所做的是创建一个特殊的“测试”用户帐户,其密码可以保存在代码或配置文件中。

答案 3 :(得分:0)

您不需要冒充来检查角色成员资格。根据您的UPN约定,只需使用constructor获取根据用户名构造的UPN(userPrincipalName)的WindowsIdentity,然后根据该身份创建WindowsPrincipal并使用IsInRole检查组中的成员身份。这适用于W2K3和Windows 2003域,但不适用于其他情况。

var userIdentity = new WindowsIdentity( username + "@domain" );
var principal = new WindowsPrincipal( userIdentity );
var inRole = principal.IsInRole( "roleName" );

您可能还需要考虑使用标准或自定义角色提供程序,以允许您使用角色界面来检查成员资格。