Полное имя, а не идентификатор домена в User.Identity.Name - PullRequest
18 голосов
/ 30 января 2009

Свойство User.Identity.Name возвращает идентификатор входа в домен.

Какой класс / свойство предоставляет действительное имя пользователя?

Для пользователя "Джон Доу", который входит в веб-приложение, предоставляющее my_domain \ jdoe

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

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

Какой класс / свойство возвращает? ... "Джон Доу"

Ответы [ 5 ]

17 голосов
/ 30 января 2009

Если вы думаете об Active Directory, вам нужно найти UserPrincipal, соответствующий данному samAccountName, и получить из него свойство 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;
        }
    }
}
4 голосов
/ 30 января 2009

Звучит так, как вместо имени для входа вы находитесь после отображаемого имени учетной записи пользователя Active Directory. Вам может потребоваться выполнить поиск в AD (DirectorySearcher) и получить отображаемое имя из свойства результата поиска.

Я предполагаю, что вы находитесь в среде AD, поскольку вы пометили вопрос adsi.

Примечание: Если вы работаете с .NET 3.5, вы можете посмотреть пост tvanfosson.

1 голос
/ 19 января 2010

Возможно, я где-то допустил ошибку, но WinNT: // ... не работает для учетных записей домена для меня. Кроме того, если пользователь не находится в том же домене, что и компьютер, PrincipalContext может не найти нужный элемент (при поиске в текущем контексте, если используется, как указано выше).

Следующее должно перевести «дружественное доменное имя», предоставленное User.Identity.Name, в ldap-совместимый домен. Использование Однозначное имя домена предоставляет необходимую информацию о пути 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
1 голос
/ 30 января 2009
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)

код, макет от здесь

1 голос
/ 30 января 2009

Интерфейс IIdentity - это интерфейс, который предоставляет свойство Name для User.Identity. Интерфейс IIdentity может быть реализован на любом количестве классов, которые знают, как искать пользователей из хранилища данных (SQL Server, Active Directory и т. Д.).

Нет свойства интерфейса IIdentity, предоставляющего "John Doe". Если эта информация находится в вашем хранилище данных, вам потребуется использовать инструменты, специфичные для этого хранилища данных, чтобы получить к ней доступ.

Тем не менее, вполне возможно, что объект, возвращаемый User.Identity, имеет свойство, которое содержит «John Doe», к которому вы могли бы иметь доступ через какой-то другой интерфейс, кроме IIdentity (наша пользовательская реализация IIdentity делает это, пример).

...