Полное имя, а не идентификатор домена в User.Identity.Name
Свойство User.Identity.Name
возвращает идентификатор входа в домен.
Какой класс/свойство предоставляет фактическое имя пользователя?
Для пользователя "John Doe", который регистрируется в веб-приложении, поставляя my_domain\jdoe
**User.Identity.Name -**
Returns : *my_domain\jdoe*
**System.Environment.UserName**
Returns: *jdoe*
Какой класс/свойство возвращается?... "Джон Доу"
Ответы
Ответ 1
Если вы думаете об 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;
}
}
}
Ответ 2
Похоже, что вместо имени входа вы видите отображаемое имя учетной записи пользователя Active Directory. Вы можете захотеть сделать поиск AD (DirectorySearcher) и получить отображаемое имя из свойства результата поиска.
Я предполагаю, что вы находитесь в среде AD, так как вы отметили вопрос adsi.
Примечание.. Если вы работаете с .NET 3.5, вам может потребоваться посмотреть сообщение tvanfosson.
Ответ 3
Интерфейс IIdentity - это тот, который предоставляет свойство Name для User.Identity. Интерфейс IIdentity может быть реализован на любом количестве классов, которые знают, как искать пользователей из хранилища данных (SQL Server, Active Directory и т.д.).
Не существует свойства интерфейса IIdentity, который предоставляет "John Doe". Если эта информация находится в вашем хранилище данных, вам необходимо использовать инструменты, специфичные для этого хранилища данных, для доступа к ней.
Тем не менее, вполне возможно, что объект, который возвращается User.Identity, обладает свойством, которое содержит "John Doe", с которым вы могли бы получить доступ через какой-либо другой интерфейс, помимо IIdentity (наша обычная реализация IIdentity делает это для пример).
Ответ 4
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)
code mock it from здесь
Ответ 5
Возможно, я где-то ошибся, но WinNT://... не работал для учетных записей домена для меня. Кроме того, если пользователь не находится в том же домене, что и машина, чем PrincipalContext может не найти искомый элемент (поскольку он ищет в текущем контексте, если используется, как указано выше).
Следующее должно перевести "дружественное доменное имя", предоставленное User.Identity.Name, в домен, совместимый с ldap. Использование differishName домена доставляет необходимую информацию о пути 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 [email protected]
// 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