Pergunta sobre active-directory, .net, c# – Obter UPN ou email para usuário conectado em um aplicativo da Web .NET

18

Eu não sou um desenvolvedor .NET, e tenho a sensação de que isso seria trivial para alguém que é:

Eu tenho um aplicativo web c # que faz usuário das credenciais do usuário logado. Atualmente ele usa o SID que vem de

System.Security.Principal.WindowsIdentity.GetCurrent().User.Value 

Eu preciso para obter o usuário UPN login ou endereço de e-mail (conforme definido no diretório ativo) em vez do SID. GetCurrent () retorna um objeto do tipo WindowsIdentity; procurando nos detalhes dos membros do WindowsIdentity:

MSDN: Membros WindowsIdentity

Eu não consigo ver nada que possa me dar o UPN ou o email lá. Como posso extrair essa informação para usar, seja alimentando o SID em alguma outra função ou chamando algo diferente em primeiro lugar.

Sua resposta

3   a resposta
1

Experimentar:

System.Security.Principal.WindowsIdentity.GetCurrent().Name
A documentação diz "Obtém o nome de logon do Windows do usuário". - isso retornará o nome do estilo NT ou o nome do estilo UPN? Eu sei que a Microsoft disse há muitos anos que UPN seria a nova maneira de identificar usuários, mas na minha experiência quase tudo funciona com credenciais do Estilo NT - e os usuários podem fazer login neste site com logoins UPN ou NT Style, então não posso confiar nele usando a mesma forma que o usuário fez. DrStalker
a partir disso, você pode alimentá-lo no objeto DirectorySearcher para obter mais detalhes sobre esse usuário específico. Para DirectorySearcher, consultedotnetactivedirectory.com/…, blog.lozanotek.com/articles/149.aspx ecodebetter.com/blogs/peter.van.ooijen/archive/2006/12/12/…. Jimmy Chandra
Fiz um teste rápido e System.Security.Principal.WindowsIdentity.GetCurrent (). O nome está retornando DOMAIN \ username DrStalker
38

Enquanto isso (.NET 3.5) este é um one-liner:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress

para o email ou

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName

para o UPN.

Isso é incrível! Eu não sabia sobre o namespace AccountManagement - exatamente o que eu estava procurando. davekaro
Isso não funciona entre domínios Sebazzz
Geralmente será nulo. djunod
Isso é bom localmente, mas não funciona no IIS. nPcomp
2

Para consultar o diretório ativo usando um pesquisador de diretório, você precisa fazer algo assim (código totalmente não testado):

    string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
    string ldapPath = "LDAP://domain.company.com";

    public string GetEmail(string userName, string ldapPath)
    {
        using (DirectoryEntry root = new DirectoryEntry(ldapPath))
        {
            DirectorySearcher searcher = new DirectorySearcher(root);
            searcher.Filter = string.Format(@"(&(sAMAccountName={0}))", userName);
            searcher.PropertiesToLoad = "mail";

            SearchResult result = searcher.FindOne();

            if (result != null)
            {
                PropertyValueCollection property = result.Properties["mail"];
                return (string)property.Value;
            }
            else
            { 
                // something bad happened
            }
        }
    }

Perguntas relacionadas