2

我有一个在我们的 Intranet 上运行的 ASP.NET 应用程序。在生产中,我可以从域上下文中获取用户并访问大量信息,包括他们的名字和姓氏(UserPrincipal.GivenName 和 UserPrincipal.Surname)。

我们的测试环境不属于生产域,测试用户在测试环境中没有域帐户。因此,我们将它们添加为本地计算机用户。当他们浏览到起始页时,系统会提示他们输入凭据。我使用以下方法获取 UserPrincipal

public static UserPrincipal GetCurrentUser()
        {
            UserPrincipal up = null;

            using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
            {
                up = UserPrincipal.FindByIdentity(context, User.Identity.Name);
            }

            if (up == null)
            {
                using (PrincipalContext context = new PrincipalContext(ContextType.Machine))
                {
                    up = UserPrincipal.FindByIdentity(context, User.Identity.Name);
                }
            }

            return up;
        }

我在这里遇到的问题是,当 ContextType == Machine 时检索 UserPrinicipal 时,我没有获得 GivenName 或 Surname 之类的属性。在创建用户(Windows Server 2008)时有没有办法设置这些值,还是我需要以不同的方式来解决这个问题?

4

1 回答 1

4

原问题中的函数需要修改。如果您尝试访问返回的 UserPrincipal 对象,您将收到 ObjectDisposedException

另外,User.Identity.Name 不可用,需要传入。

我对上面的函数进行了以下更改。

public static UserPrincipal GetUserPrincipal(String userName)
        {
            UserPrincipal up = null;

            PrincipalContext context = new PrincipalContext(ContextType.Domain);
            up = UserPrincipal.FindByIdentity(context, userName);

            if (up == null)
            {
                context = new PrincipalContext(ContextType.Machine);
                up = UserPrincipal.FindByIdentity(context, userName);
            }

            if(up == null)
                throw new Exception("Unable to get user from Domain or Machine context.");

            return up;
        }

此外,我需要使用的 UserPrincipal 的属性是 DisplayName (而不是 GivenName 和 Surname);

于 2009-10-02T17:39:34.227 回答