18

User.Identity.Name属性返回域登录 ID。

哪个类/属性公开了实际的用户名?

对于登录到提供 my_domain\jdoe 的 Web 应用程序的用户“John Doe”

**User.Identity.Name -** 
Returns : *my_domain\jdoe*

**System.Environment.UserName**
Returns: *jdoe*

哪个类/属性返回?...“约翰·多伊”

4

5 回答 5

18

如果您正在考虑 Active Directory,则需要找到与给定 samAccountName 对应的 UserPrincipal 并从中获取 DisplayName 属性。请注意,它可能未设置。

string fullName = null;
using (PrincipalContext context = new PrincipalContext( ContextType.Domain ))
{
    using (UserPrincipal user
            = UserPrincipal.FindByIdentity( context,
                                            User.Identity.Name ))
    {
        if (user != null)
        {
            fullName = user.DisplayName;
        }
    }
}
于 2009-01-30T00:10:29.030 回答
4

听起来您不是登录名,而是 Active Directory 用户帐户的显示名。您可能想要做的是执行 AD 搜索 (DirectorySearcher) 并从搜索结果属性中获取显示名称。

我假设您处于 AD 环境中,因为您标记了问题 adsi。

注意:如果您使用的是 .NET 3.5,您可能需要查看 tvanfosson 的帖子。

于 2009-01-30T00:09:00.830 回答
1

IIdentity 接口是在 User.Identity 上提供 Name 属性的接口。IIdentity 接口可以在任意数量的类上实现,这些类知道如何从数据存储(SQL Server、Active Directory 等)中查找用户。

IIdentity 接口没有提供“John Doe”的属性。如果该信息位于您的数据存储中,那么您将需要使用特定于该数据存储的工具来访问它。

也就是说,User.Identity 返回的对象完全有可能具有包含“John Doe”的属性,您可以通过 IIdentity 之外的其他接口访问该属性(例如,我们的自定义 IIdentity 实现就是这样做的)。

于 2009-01-30T00:06:13.220 回答
1

也许我在某个地方犯了一个错误,但是 WinNT://... 对我来说没有为域帐户工作。此外,如果用户与机器不在同一个域中,那么 PrincipalContext 可能找不到想要的元素(因为它在当前上下文中搜索,如果如上所述使用)。

以下内容应将 User.Identity.Name 提供的“友好域名”转换为符合 ldap 的域。使用域的 distinctName 提供所需的 ldap 路径信息(这已经解决了我的跨域问题):

(VB.NET, sorry)
Imports System.DirectoryServices
Imports System.DirectoryServices.AccountManagement
Imports System.DirectoryServices.ActiveDirectory
...

Dim strUserName As String
Dim objDirContext As DirectoryContext
Dim objContext As PrincipalContext
Dim objPrincipal As Principal
Dim strLDAPDomainPath As String
...

// User.Identity.Name delivers domain\account or account@domain
// Split User.Identity.Name in domain and account as specified above
strDomain = "my_domain"
strAccount = "jdoe"

// Get LDAP domain relative path (distinguishName) from short domain name (e.g. my_domain -> us.my_domain.com -> DC=us,DC=my_domain,DC=com)
Try
    objDirContext = New DirectoryContext(DirectoryContextType.Domain, strDomain)
    strLDAPDomainPath = Domain.GetDomain(objDirContext).GetDirectoryEntry.Properties("distinguishedName").Value.ToString
Catch objException As DirectoryServicesCOMException
    Throw New Exception("Couldn't get LDAP domain: " & objException.Message)
End Try

// Find user in LDAP
// Nothing results in using current domain controller
Try
   objContext = New PrincipalContext(ContextType.Domain, Nothing, strLDAPDomainPath)
   objPrincipal = Principal.FindByIdentity(objContext, IdentityType.Name, strAccount)

   If Not IsNothing(objPrincipal) Then
      strUserName = objPrincipal.DisplayName
   End If
Catch objException As Exception
   Throw New Exception("Couldn't get user display name: " & objException.Message)
End Try

// strUserName should now contain the wanted full name
于 2010-01-19T18:28:56.223 回答
1
using System.DirectoryServices;


public static string GetFullName(string strLogin)
    {
        string str = "";
        string strDomain;
        string strName;

        // Parse the string to check if domain name is present.
        int idx = strLogin.IndexOf('\\');
        if (idx == -1)
        {
            idx = strLogin.IndexOf('@');
        }

        if (idx != -1)
        {
            strDomain = strLogin.Substring(0, idx);
            strName = strLogin.Substring(idx + 1);
        }
        else
        {
            strDomain = Environment.MachineName;
            strName = strLogin;
        }

        DirectoryEntry obDirEntry = null;
        try
        {
            obDirEntry = new DirectoryEntry("WinNT://" + strDomain + "/" + strName);
            System.DirectoryServices.PropertyCollection coll = obDirEntry.Properties;
            object obVal = coll["FullName"].Value;
            str = obVal.ToString();
        }
        catch (Exception ex)
        {
            str = ex.Message;
        }
        return str;
    }

你可以打电话

var strJonDoeName = GetFullName(User.Identity.Name)

代码从这里模拟它

于 2009-01-30T00:14:57.150 回答