2

我从 Active Directory 获取 UserPrincipal 时遇到问题。首先,我在本地环境中使用过(不是使用 IIS,而是使用 ASP.NET 开发服务器):

User usr = new User();
usr.SoeId = Request.ServerVariables["LOGON_USER"];
usr.IP = Request.ServerVariables["REMOTE_ADDR"];
usr.FirstName = UserPrincipal.Current.GivenName;
usr.LastName = UserPrincipal.Current.Surname;

它工作正常。我得到了我想要的。但是,当我在测试环境中安装应用程序时,出现错误“对象引用未设置为对象的实例”。我从这里尝试过解决方案。

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
    UserPrincipal up = UserPrincipal.FindByIdentity(pc, usr.SoeId);
    return up.DisplayName;
    // or return up.GivenName + " " + up.Surname;
}

但它不起作用。

我使用 Windows 身份验证。模拟设置为真。请帮我。

4

2 回答 2

4

更改您的身份ApplicationPool以使用域用户运行。

在 iis 6 中,右键单击您的应用程序池,转到Identity选项卡并设置一个域用户,池将在该用户下运行。

在iis 7中右键单击您的应用程序池,选择高级设置,在您会发现的进程模型下Identity,将其更改为使用域用户。

您还可以传递域用户并传递给PrincipalContest Constructor

using (PrincipalContext context = new PrincipalContext(
                                    ContextType.Domain,
                                    "name of your domain",
                                    "container of your domain",
                                    "user@domain", //create a user in domain for context creation purpose.. this username will be constant.. you can keep it in app config
                                    "password")){
    UserPrincipal up = UserPrincipal.FindByIdentity(pc, usr.SoeId);
    return up.DisplayName;
}

如果您的域名是,dom.com那么您的容器将类似于DC=dom,DC=com,用户名应为user@dom.comdom\user

于 2012-10-02T15:37:29.697 回答
1

用这个:

 // find currently logged in user
        UserPrincipal adUser = null;
        using (HostingEnvironment.Impersonate())
        {
            var userContext = System.Web.HttpContext.Current.User.Identity;
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
            adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
        }

您必须将任何“上下文”调用包含在 HostingEnvironment.Impersonate

于 2016-01-22T16:47:00.320 回答