简而言之,没有。但是你走在正确的轨道上。您必须通过使用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(); }
您不应该冒充身份检查角色成员资格。只需使用 构造函数 对于根据您的UPN约定从用户名构造UPN(userPrincipalName)的WindowsIdentity,然后从该标识创建一个WindowsPrincipal并使用 IsInRole 检查组中的成员身份。这适用于W2K3和Windows 2003域,但在其他情况下不适用。
var userIdentity = new WindowsIdentity( username + "@domain" ); var principal = new WindowsPrincipal( userIdentity ); var inRole = principal.IsInRole( "roleName" );
您可能还需要考虑使用标准角色或自定义角色提供程序,以允许您使用角色界面来检查成员资格。
您是否正在使用WindowsPrincipal中特定于Windows的任何内容,或者它只是一种方便的方式来获取auth / auth而无需管理用户?如果你需要基于Windows,Serapth有正确的方法。如果您只是将它用作方便的auth / auth存储,那么您应该编写代码以与IPrincipal接口。然后,您可以将自己的IPrincipal实现注入HttpContext.User或Thread.CurrentThread.Principal,具体取决于测试和应用程序的性质。
用户令牌(Impersonate中IntPtr表示的值)表示的用户名不仅仅是用户名。它们是内部窗口上下文的句柄,包括有关用户,身份验证令牌,当前安全权限等的信息。正因为如此,您无法在没有密码的情况下进行模拟。您必须实际“登录”以通过创建令牌 LogonUser方法 。
我过去所做的是创建一个特殊的“测试”用户帐户,其密码可以保存在代码或配置文件中。