Как найти отображаемое имя пользователя Active Directory в веб-приложении C #?

Я пишу веб-приложение, которое использует проверку подлинности Windows, и я с радостью могу получить имя пользователя для входа, используя что-то вроде:

 string login = User.Identity.Name.ToString();

Но мне не нужно их имя для входа, мне нужно их DisplayName. Уже пару часов бью головой ...

Могу ли я получить доступ к AD моей организации через веб-приложение?


person inspite    schedule 29.10.2008    source источник


Ответы (5)


Как насчет этого:

private static string GetFullName()
    {
        try
        {
            DirectoryEntry de = new DirectoryEntry("WinNT://" + Environment.UserDomainName + "/" + Environment.UserName);
            return de.Properties["displayName"].Value.ToString();
        }
        catch { return null; }
    }
person Community    schedule 29.10.2008
comment
Это лучший способ сделать это для прав одного пользователя. - person thismat; 29.10.2008
comment
Ага, мне нравится простота этого АЛОТА, тем более что оно работает. Я должен тебе выпить! - person inspite; 29.10.2008
comment
Это сработало, но свойства WINNT: // намного менее понятны, чем свойства LDAP: // (см. rlmueller.net/Name_Attributes.htm), поэтому, хотя это сработало, мне не удалось получить, скажем, адреса электронной почты пользователя с помощью привязки WINNT: // - person inspite; 11.11.2008

См. Соответствующий вопрос: Active Directory: получение информации о пользователе

См. Также: Howto: (Почти) все в Active Directory через C # и др. в частности раздел «Перечислить свойства объекта».

Если у вас есть путь для подключения к группе в домене, вам может быть полезен следующий фрагмент:

GetUserProperty("<myaccount>", "DisplayName");

public static string GetUserProperty(string accountName, string propertyName)
{
    DirectoryEntry entry = new DirectoryEntry();
    // "LDAP://CN=<group name>, CN =<Users>, DC=<domain component>, DC=<domain component>,..."
    entry.Path = "LDAP://...";
    entry.AuthenticationType = AuthenticationTypes.Secure;

    DirectorySearcher search = new DirectorySearcher(entry);
    search.Filter = "(SAMAccountName=" + accountName + ")";
    search.PropertiesToLoad.Add(propertyName);

    SearchResultCollection results = search.FindAll();
    if (results != null && results.Count > 0)
    {
        return results[0].Properties[propertyName][0].ToString();
    }
    else
    {
            return "Unknown User";
    }
}
person Panos    schedule 29.10.2008

Использовать это:

string displayName = UserPrincipal.Current.DisplayName;

person user2239589    schedule 03.04.2013
comment
Это применимо, если ваше веб-приложение использует проверку подлинности Windows. Для доступа к UserPrincipal вам потребуются сборка System.DirectoryServices.AccountManagement и пространство имен. - person Jeremy Cook; 18.03.2019

На всякий случай, мне удалось взломать вот это:

      /// This is some imaginary code to show you how to use it

      Session["USER"] = User.Identity.Name.ToString();
      Session["LOGIN"] = RemoveDomainPrefix(User.Identity.Name.ToString()); // not a real function :D
      string ldappath = "LDAP://your_ldap_path";
      // "LDAP://CN=<group name>, CN =<Users>, DC=<domain component>, DC=<domain component>,..."


      Session["cn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "cn");
      Session["displayName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "displayName");
      Session["mail"] = GetAttribute(ldappath, (string)Session["LOGIN"], "mail");
      Session["givenName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "givenName");
      Session["sn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "sn");


/// working code

public static string GetAttribute(string ldappath, string sAMAccountName, string attribute)
    {
        string OUT = string.Empty;

        try
        {
            DirectoryEntry de = new DirectoryEntry(ldappath);
            DirectorySearcher ds = new DirectorySearcher(de);
            ds.Filter = "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" + sAMAccountName + "))";

            SearchResultCollection results = ds.FindAll();

            foreach (SearchResult result in results)
            {
                OUT =  GetProperty(result, attribute);
            }
        }
        catch (Exception t)
        {
            // System.Diagnostics.Debug.WriteLine(t.Message);
        }

        return (OUT != null) ? OUT : string.Empty;
    }

public static string GetProperty(SearchResult searchResult, string PropertyName)
    {
        if (searchResult.Properties.Contains(PropertyName))
        {
            return searchResult.Properties[PropertyName][0].ToString();
        }
        else
        {
            return string.Empty;
        }
    }
person inspite    schedule 11.11.2008

Если вам интересно, существует проект CodePlex для Linq to AD.

Это также описано в книге LINQ Unleashed для C # Пола Киммела - он использует вышеупомянутый проект в качестве отправной точки.

не связан ни с одним из источников - я недавно прочитал книгу

person GalacticCowboy    schedule 29.10.2008