System.Security.Principal.WindowsIdentity.Impersonate函数采用System.intptr参数,这在我的情况下似乎非常无用(我的理解有限)。
我正在开发一个内部网应用程序,该应用程序使用集成安全性逐页授权用户与其Windows身份相关联的角色。我没有密码或任何类似的东西。只需一个Windows用户名。出于测试目的,我怎么可能基于用户名冒充Windows用户? 提前致谢:)
答案 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" );
您可能还需要考虑使用标准或自定义角色提供程序,以允许您使用角色界面来检查成员资格。