Log in to AD

Asked

Viewed 188 times

1

Good evening, everyone,

I need to login to AD using C#,

I heard about a class called Principalcontext, you know how I use it?

I saw that I have to go through Domain, would not work like the Directororyentry using Ldappath?

  • 1

    Your application is what, exactly? Some types of applications run this login automatically.

  • @Gypsy I am in an identity management project, where our system will migrate all users of AD, AD2, AD3, IDENTITY1, etc. to our base, we will leave several systems that have multiple login screens with only one, it accesses our base, checks which directory belongs to and accesses the AD or IDENTITY, so now I need to do the Login part to access the AD, Identity is already done, I’m trying to access via Principalcontext,

1 answer

1


I have a Helper which can be useful for your case. As it is static class, it can be implemented in any solution and improved.

Note that there are several ways to do a certain search. Some use PrincipalContext, others using DirectorySearcher. Implement the code, make the necessary modifications and perform tests:

public static class ActiveDirectoryHelper
{
    /// <summary>
    /// Converte uma array de bytes do campo thumbnailPhoto do AD para uma foto.
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    static Image ByteToPhoto(byte[] data)
    {
        if (data != null)
        {
            using (MemoryStream s = new MemoryStream(data))
            {
                return Bitmap.FromStream(s);
            }
        }

        return null;
    }

    /// <summary>
    /// Pesquisa o campo thumbnailPhoto do AD.
    /// </summary>
    /// <param name="userName"></param>
    /// <returns></returns>
    static Image GetUserPicture(string userName)
    {
        using (DirectorySearcher dsSearcher = new DirectorySearcher())
        {
            dsSearcher.Filter = "(&(objectClass=user) (cn=" + userName + "))";
            SearchResult result = dsSearcher.FindOne();

            using (DirectoryEntry user = new DirectoryEntry(result.Path))
            {
                byte[] data = user.Properties["thumbnailPhoto"].Value as byte[];

                if (data != null)
                {
                    using (MemoryStream s = new MemoryStream(data))
                    {
                        return Bitmap.FromStream(s);
                    }
                }

                return null;
            }
        }
    }

    /// <summary>
    /// Traz um usuário do AD com algumas informações.
    /// </summary>
    /// <param name="search"></param>
    /// <returns></returns>
    public static ActiveDirectoryUserViewModel GetADUser(String search)
    {
        using (var context = new PrincipalContext(ContextType.Domain, "meudominio.com"))
        {
            var result = UserPrincipal.FindByIdentity(context, search);

            return new ActiveDirectoryUserViewModel
            {
                Sid = result.Sid,
                DisplayName = result.DisplayName,
                Email = result.EmailAddress,
                Mapped = true,
                UserName = result.UserPrincipalName,
                FirstName = result.GivenName,
                MiddleName = result.MiddleName,
                Surname = result.Surname,
                VoiceTelephoneNumber = result.VoiceTelephoneNumber
            };
        }
    }

    /// <summary>
    /// Traz todos os usuários das unidades organizacionais "Usuarios" e "SP".
    /// </summary>
    /// <returns></returns>
    public static IEnumerable<ActiveDirectoryUserViewModel> GetADUsers()
    {
        using (var context = new PrincipalContext(ContextType.Domain, "meudominio.com", "OU=Usuarios,OU=SP,DC=meudominio,DC=com"))
        {
            UserPrincipalExtended userPrincipal = new UserPrincipalExtended(context);
            userPrincipal.Enabled = true;

            using (var searcher = new PrincipalSearcher(userPrincipal))
            {
                foreach (Principal result in searcher.FindAll().Where(r => r.DisplayName != ""))
                {
                    // DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
                    UserPrincipalExtended upe = result as UserPrincipalExtended;
                    /* Debug.WriteLine("First Name: " + de.Properties["givenName"].Value);
                    Debug.WriteLine("Last Name : " + de.Properties["sn"].Value);
                    Debug.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
                    Debug.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
                    Debug.WriteLine(); */
                    /* yield return new ActiveDirectoryUserViewModel
                    {
                        Sid = new System.Security.Principal.SecurityIdentifier((byte[])de.Properties["objectSid"].Value, 0),
                        DisplayName = (de.Properties["displayName"].Value ?? de.Properties["name"].Value).ToString(),
                        // UserName = de.Properties["name"].Value.ToString()
                        UserName = de.Properties["sAMAccountName"].Value.ToString(),
                        Department = de.Properties["department"].Value.ToString(),
                        VoiceTelephoneNumber = de.Properties["telephoneNumber"].Value.ToString()
                    }; */
                    if ((upe.VoiceTelephoneNumber ?? "").Trim() != "" && (upe.Department ?? "").Trim() != "")
                    {
                        yield return new ActiveDirectoryUserViewModel
                        {
                            Sid = upe.Sid,
                            DisplayName = upe.DisplayName,
                            // UserName = de.Properties["name"].Value.ToString()
                            UserName = upe.UserPrincipalName,
                            Department = upe.Department,
                            VoiceTelephoneNumber = upe.VoiceTelephoneNumber
                        };
                    }
                }
            }
        }
    }

    /// <summary>
    /// Traz um usuário do AD por login.
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public static ActiveDirectoryUserViewModel GetADUserByLogin(String name)
    {
        var filter = "(&(objectClass=user)(objectCategory=person)(samaccountname=" + name.Replace("DOMINIO\\", "") + "))";
        using (var context = new PrincipalContext(ContextType.Domain, "meudominio.com"))
        { 
            var result = InternalSearch(filter);
            result.Groups = UserPrincipal.FindByIdentity(context, name)
                                         .GetGroups()
                                         .Select(g => new ActiveDirectoryGroupViewModel { Sid = g.Sid, Name = g.Name, Description = g.Description })
                                         .ToList();
            return result;
        };
    }

    /// <summary>
    /// Traz um usuário do AD por Sid (security identifier).
    /// </summary>
    /// <param name="sid"></param>
    /// <returns></returns>
    public static ActiveDirectoryUserViewModel GetADUserBySid(String sid)
    {
        var filter = "(&(objectClass=user)(objectCategory=person)(objectSid=" + sid + "))";
        return InternalSearch(filter);
    }

    /// <summary>
    /// Método auxiliar para montar pesquisas do AD.
    /// </summary>
    /// <param name="filter"></param>
    /// <returns></returns>
    static ActiveDirectoryUserViewModel InternalSearch(String filter)
    {
        using (DirectoryEntry entry = new DirectoryEntry("LDAP://meudominio.com"))
        {
            DirectorySearcher search = new DirectorySearcher(entry);
            // search.Filter = "(&(objectClass=user)(l=" + name + "))";
            search.Filter = filter;
            search.PropertiesToLoad.AddRange(new string[] {"samaccountname", "mail", "usergroup", "department", "displayname", "cn", "givenName", "initials", 
                "sn", "homePostalAddress", "title", "company", "st", "l", "co", "postalcode", "telephoneNumber", "otherTelephone", "facsimileTelephoneNumber", "mail", 
                "extensionAttribute1", "extensionAttribute2", "extensionAttribute3", "extensionAttribute4", "extensionAttribute5", "extensionAttribute6", 
                "extensionAttribute7", "extensionAttribute8", "extensionAttribute9", "extensionAttribute10", "extensionAttribute11", "extensionAttribute12", 
                "whenChanged", "whenCreated", "thumbnailPhoto", "objectSid", "objectGUID"}
            );

            foreach (SearchResult sResultSet in search.FindAll())
            {
                /* Debug.WriteLine("samaccountname: " + GetProperty(sResultSet, "samaccountname"));
                // Login Name
                Debug.WriteLine("cn: " + GetProperty(sResultSet, "cn"));
                // First Name
                Debug.WriteLine("givenName: " + GetProperty(sResultSet, "givenName"));
                // Middle Initials
                Debug.WriteLine("initials: " + GetProperty(sResultSet, "initials"));
                // Last Name
                Debug.WriteLine("sn: " + GetProperty(sResultSet, "sn"));
                // Address
                string tempAddress = GetProperty(sResultSet, "homePostalAddress");

                if (tempAddress != string.Empty)
                {
                    string[] addressArray = tempAddress.Split(';');
                    string taddr1, taddr2;
                    taddr1 = addressArray[0];
                    Debug.WriteLine(taddr1);
                    taddr2 = addressArray[1];
                    Debug.WriteLine(taddr2);
                }
                // title
                Debug.WriteLine("title: " + GetProperty(sResultSet, "title"));
                // company
                Debug.WriteLine("company: " + GetProperty(sResultSet, "company"));
                //state
                Debug.WriteLine("st: " + GetProperty(sResultSet, "st"));
                //city
                Debug.WriteLine("l: " + GetProperty(sResultSet, "l"));
                //country
                Debug.WriteLine("co: " + GetProperty(sResultSet, "co"));
                //postal code
                Debug.WriteLine("postalCode: " + GetProperty(sResultSet, "postalCode"));
                // telephonenumber
                Debug.WriteLine("telephoneNumber: " + GetProperty(sResultSet, "telephoneNumber"));
                //extention
                Debug.WriteLine("otherTelephone: " + GetProperty(sResultSet, "otherTelephone"));
                //fax
                Debug.WriteLine("facsimileTelephoneNumber: " + GetProperty(sResultSet, "facsimileTelephoneNumber"));

                // email address
                Debug.WriteLine("mail: " + GetProperty(sResultSet, "mail"));
                // Challenge Question
                Debug.WriteLine("extensionAttribute1: " + GetProperty(sResultSet, "extensionAttribute1"));
                // Challenge Response
                Debug.WriteLine("extensionAttribute2: " + GetProperty(sResultSet, "extensionAttribute2"));
                //Member Company
                Debug.WriteLine("extensionAttribute3: " + GetProperty(sResultSet, "extensionAttribute3"));
                // Company Relation ship Exits
                Debug.WriteLine("extensionAttribute4: " + GetProperty(sResultSet, "extensionAttribute4"));
                //status
                Debug.WriteLine("extensionAttribute5: " + GetProperty(sResultSet, "extensionAttribute5"));
                // Assigned Sales Person
                Debug.WriteLine("extensionAttribute6: " + GetProperty(sResultSet, "extensionAttribute6"));
                // Accept T and C
                Debug.WriteLine("extensionAttribute7: " + GetProperty(sResultSet, "extensionAttribute7"));
                // jobs
                Debug.WriteLine("extensionAttribute8: " + GetProperty(sResultSet, "extensionAttribute8"));
                String tEmail = GetProperty(sResultSet, "extensionAttribute9");

                // email over night
                if (tEmail != string.Empty)
                {
                    string em1, em2, em3;
                    string[] emailArray = tEmail.Split(';');
                    em1 = emailArray[0];
                    em2 = emailArray[1];
                    em3 = emailArray[2];
                    Debug.WriteLine(em1 + em2 + em3);

                }
                // email daily emerging market
                Debug.WriteLine("extensionAttribute10: " + GetProperty(sResultSet, "extensionAttribute10"));
                // email daily corporate market
                Debug.WriteLine("extensionAttribute11: " + GetProperty(sResultSet, "extensionAttribute11"));
                // AssetMgt Range
                Debug.WriteLine("extensionAttribute12: " + GetProperty(sResultSet, "extensionAttribute12"));
                // date of account created
                Debug.WriteLine("whenCreated: " + GetProperty(sResultSet, "whenCreated"));
                // date of account changed
                Debug.WriteLine("whenChanged " + GetProperty(sResultSet, "whenChanged"));

                Debug.WriteLine("department: " + GetProperty(sResultSet, "department")); */


                return new ActiveDirectoryUserViewModel
                {
                    Sid = new System.Security.Principal.SecurityIdentifier((byte[])sResultSet.Properties["objectSid"][0], 0),
                    // Guid = GetProperty(sResultSet, "objectGUID"),
                    DisplayName = GetProperty(sResultSet, "displayname"),
                    Email = GetProperty(sResultSet, "mail"),
                    Mapped = true,
                    UserName = GetProperty(sResultSet, "samaccountname"),
                    FirstName = GetProperty(sResultSet, "givenName"),
                    Surname = GetProperty(sResultSet, "sn"),
                    VoiceTelephoneNumber = GetProperty(sResultSet, "telephoneNumber"),
                    JobTitle = GetProperty(sResultSet, "title"),
                    Department = GetProperty(sResultSet, "department"),
                    Photo = sResultSet.Properties["thumbnailPhoto"][0] as byte[]
                };
            }
        }

        return new ActiveDirectoryUserViewModel();
    }

    /// <summary>
    /// Trz todos os grupos do AD.
    /// </summary>
    /// <returns></returns>
    public static IEnumerable<ActiveDirectoryGroupViewModel> GetAllGroups()
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
        GroupPrincipal qbeGroup = new GroupPrincipal(ctx);
        PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);

        foreach (var found in srch.FindAll())
        {
            yield return new ActiveDirectoryGroupViewModel
            {
                Name = found.Name,
                Sid = found.Sid,
                Description = found.Description
            };
        }
    }

    /// <summary>
    /// Traz um grupo do AD por Sid (security identifier).
    /// </summary>
    /// <param name="sid"></param>
    /// <returns></returns>
    public static ActiveDirectoryGroupViewModel GetGroup(String sid)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
        GroupPrincipal qbeGroup = new GroupPrincipal(ctx);
        var search = GroupPrincipal.FindByIdentity(ctx, IdentityType.Sid, sid);

        if (search != null)
        {
            return new ActiveDirectoryGroupViewModel {
                Name = search.Name, 
                Description = search.Description,
                Sid = search.Sid
            };

            /* foreach (Principal p in search.GetMembers())
            {
                Debug.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
            } */
        }

        return null;
    }

    /// <summary>
    /// Método interno para tratamento de propriedade do AD.
    /// </summary>
    /// <param name="searchResult"></param>
    /// <param name="PropertyName"></param>
    /// <returns></returns>
    private static string GetProperty(SearchResult searchResult, string PropertyName)
    {
        if (searchResult.Properties.Contains(PropertyName))
        {
            return searchResult.Properties[PropertyName][0].ToString();
        }
        else
        {
            return string.Empty;
        }
    }
}

Notice that I use some Viewmodels there. I made it to an ASP.NET MVC system, but you can use it to any other system without problems. Their implementation is below:

public class ActiveDirectoryGroupViewModel
{
    [DisplayName("Identificador de Segurança")]
    public SecurityIdentifier Sid { get; set; }
    [DisplayName("Nome")]
    public String Name { get; set; }
    [DisplayName("Descrição")]
    public String Description { get; set; }
}

public class ActiveDirectoryUserViewModel
{
    [DisplayName("SID")]
    public SecurityIdentifier Sid { get; set; }
    [DisplayName("Guid")]
    public String Guid { get; set; }
    [DisplayName("Login")]
    public string Login { get; set; }
    [DisplayName("Endereço de E-Mail")]
    public string Email { get; set; }
    [DisplayName("Nome de Usuário")]
    public string UserName { get; set; }
    [DisplayName("Nome de Exibição")]
    public string DisplayName { get; set; }
    [DisplayName("Mapeado?")]
    public bool Mapped { get; set; }
    [DisplayName("Unidade Organizacional")]
    public string OrganizationalUnit { get; set; }
    [DisplayName("Primeiro Nome")]
    public string FirstName { get; set; }
    [DisplayName("Nome do Meio")]
    public string MiddleName { get; set; }
    [DisplayName("Sobrenome")]
    public string Surname { get; set; }
    [DisplayName("Telefone")]
    public string VoiceTelephoneNumber { get; set; }
    [DisplayName("Cargo")]
    public String JobTitle { get; set; }
    [DisplayName("Departamento")]
    public String Department { get; set; }
    [DisplayName("Foto")]
    public byte[] Photo { get; set; }

    [DisplayName("Grupos")]
    public List<ActiveDirectoryGroupViewModel> Groups { get; set; }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.