none
Active directory RRS feed

  • Pregunta

  • Hola buen dia.

    Estoy tratando de trabajar el Directorio Activo desde SilverLight 3, peo no se si esto sea posible, que es lo qu equiere:

    Es posible por medio de SilverLight 3 auntenticar un usuario con el directorio activo?

    y tambien poder obtener una lista de usuarios???

    Espero puedan responder mis dudas..

     

    saludos y gracias

    miércoles, 8 de diciembre de 2010 21:53

Respuestas

  • Hola Buen dia.

    Luego de buscar un poco he logrado lo que me realmente deseaba, pongo aca la solución pro si alguien ma slo desea. Acepto las correcciones pertinentes para obtener un mejor rendimiento, asi tener algo optimo.

    Servicio Web WCF Habilitado para SilverLight

     Metodo web para autenticarse

    [OperationContract]        

        public bool isAuthenticated(string domain, string username, string pwd)

        {

            string adPath = "LDAP://Midominio.Com";

            string domainAndUserName = username;

            DirectoryEntry entry = new DirectoryEntry(adPath, domainAndUserName, pwd);

            try

            {

                Object obj = entry.NativeObject;

                DirectorySearcher search = new DirectorySearcher(entry);

                search.Filter = "(SAMAccountName=" + username + ")";

                search.PropertiesToLoad.Add("cn");

                SearchResult result = search.FindOne();

                if (null == result)

                    return false;           

                return true;

            }

            catch (Exception ex)

            {

                //Mensaje de error deseado

                return false;

            }

        }

     Codigo en silverligh para invocar el metodo web

     ServicioClient proxy = new ServicioClient();

    proxy.isAuthenticatedCompleted += new EventHandler<isAuthenticatedCompletedEventArgs>(Loguearse);

    proxy.isAuthenticatedAsync("MiDominio", txtMyUsr.Text.Trim(), txtMyPwd.Password.Trim());

     

    void Loguearse(object sender, isAuthenticatedCompletedEventArgs e)

    {

          if (e.Error == null)

          {

                if (Convert.ToBoolean(e.Result))

                {

                      MessageBox.Show("Logueado Correctamente...");

                      ServicioClient proxy = new ServicioClient();                  

                 }

                 else

                     MessageBox.Show("Error: Usuario/Contraseña Incorrecta...");

                }

                else

                    MessageBox.Show("Error:" + e.Error.Message.ToString());       

    }

     De esta forma me autentico con el usuario del AD

    Para obtener un listado de los usuarios del AD por medio de un filtro huso el sig Metodo web:

    public class UsuariosAD //Esta clase la uso para almacenar el listado, y es la que retorna el metodo web

    {

       public string Cve_Usuario { get; set; }

       public string Cmp_NombreCompleto { get; set; }

       public string Cmp_Apellidos { get; set; }

       public string Cmp_Nombre { get; set; }

    }

      

    [OperationContract]

    public List<UsuariosAD> estraerUsrsAD(string criteria, string username, string pwd)

    {

         string LDAPURL = "LDAP://Midominio.Com";

         Collection<UsuariosAD> usrs = new Collection<UsuariosAD>();      

     

         DirectoryEntry entries = new DirectoryEntry(LDAPURL, username, pwd);

         string Filter;

         Filter = criteria;

         Filter = Filter.Replace("&", "");

         Filter = Filter.Replace("|", "");

         Filter = Filter.Replace("*", "");

         string FilterByName = "(CN=*{0}*)";

         string f = string.Empty;

         //if (Type == LDAPFilterType.OnlyUsers) El filtro lo hago unicamente por usuario, pero pueder ser por grupos o derechos del usuario

         f = "(&(objectCategory=person)(objectClass=user){0})";

         if (Filter == string.Empty)

         {

                filter = string.Format(f, string.Empty);

         }

         else

         {

                filter = string.Format(f, string.Format(FilterByName, Filter));

         } 

         DirectorySearcher searcher = new DirectorySearcher(entries, filter);

            int x = searcher.PageSize;

            try

            {

                foreach (SearchResult result in searcher.FindAll())

                {

                    usrs.Add(new UsuariosAD()

                    {

                        Cve_Usuario = (string)result.Properties["samAccountName"][0],

                        Cmp_NombreCompleto = (string)result.Properties["CN"][0],

                        Cmp_Apellidos = (string)result.Properties["SN"][0], //Todo funciona bien, pero si hay un usuario que no trae apellidos me marca errorres, si encuentran una solucion me avisan jejeje...

                        Cmp_Nombre = (string)result.Properties["givenName"][0]

                    });

                }

            }

            catch (Exception ex)

            {

                //Mensaje de error....

            }       

            return usrs.ToList(); //retorno la clase como una lita...

        }

     Codigo en silverligh para invocar el metodo web

    ServicioClient proxy = new ServicioClient();

    proxy.estraerUsrsADCompleted += new EventHandler<estraerUsrsADCompletedEventArgs>(listaUsuariosAD);

    proxy.estraerUsrsADAsync(txtCriterioBusqueda.Text.Trim(), txtMyUsr.Text.Trim(), txtMyPwd.Password.Trim());

     

    void listaUsuariosAD(object sender, estraerUsrsADCompletedEventArgs e)

    {

          if (e.Error == null)     

                    dtgDatos.ItemsSource = e.Result; //aca obtengo el listado y listo para manipularlo

          else

                MessageBox.Show("Error:" + e.Error.Message.ToString());

    }

     

    Bueno, esto es lo que hice, no es lo mas optimo ni quiza lo mas factible, pero me funciona OK, si le pueden agregar o quitar para su mejor funcionamiento les agradeceria muchisimo me lo hicieran saber..

     

    saludos y espero sirva de algo....

     Nota: se me olvidaba, para que funcionen tenemos que agregar la referencia using System.DirectoryServices esta agregar los metodos para trabajar con el AD.

    • Marcado como respuesta javierTR viernes, 10 de diciembre de 2010 18:33
    viernes, 10 de diciembre de 2010 18:32

Todas las respuestas

  • Hola, Javier!

     

    En los siguientes links encontrarás información que creo te será de utilidad:

     

    http://www.silverlightshow.net/items/Silverlight-3-with-Ria-Authentication-service.aspx

    http://rouslan.com/2009/03/20-steps-to-get-together-windows-authentication-silverlight-and-wcf-service/

     

    Espero te sirva.

     

    Bendiciones!


    Si la respuesta te es de utilidad, recuerda marcarla como Respuesta y/o votarla como Útil. Así colaboras a que el foro esté organizado.
    jueves, 9 de diciembre de 2010 12:49
  • Gracias AlexLander, los reviso ahora...
    jueves, 9 de diciembre de 2010 14:20
  • Hola Buen dia.

    Luego de buscar un poco he logrado lo que me realmente deseaba, pongo aca la solución pro si alguien ma slo desea. Acepto las correcciones pertinentes para obtener un mejor rendimiento, asi tener algo optimo.

    Servicio Web WCF Habilitado para SilverLight

     Metodo web para autenticarse

    [OperationContract]        

        public bool isAuthenticated(string domain, string username, string pwd)

        {

            string adPath = "LDAP://Midominio.Com";

            string domainAndUserName = username;

            DirectoryEntry entry = new DirectoryEntry(adPath, domainAndUserName, pwd);

            try

            {

                Object obj = entry.NativeObject;

                DirectorySearcher search = new DirectorySearcher(entry);

                search.Filter = "(SAMAccountName=" + username + ")";

                search.PropertiesToLoad.Add("cn");

                SearchResult result = search.FindOne();

                if (null == result)

                    return false;           

                return true;

            }

            catch (Exception ex)

            {

                //Mensaje de error deseado

                return false;

            }

        }

     Codigo en silverligh para invocar el metodo web

     ServicioClient proxy = new ServicioClient();

    proxy.isAuthenticatedCompleted += new EventHandler<isAuthenticatedCompletedEventArgs>(Loguearse);

    proxy.isAuthenticatedAsync("MiDominio", txtMyUsr.Text.Trim(), txtMyPwd.Password.Trim());

     

    void Loguearse(object sender, isAuthenticatedCompletedEventArgs e)

    {

          if (e.Error == null)

          {

                if (Convert.ToBoolean(e.Result))

                {

                      MessageBox.Show("Logueado Correctamente...");

                      ServicioClient proxy = new ServicioClient();                  

                 }

                 else

                     MessageBox.Show("Error: Usuario/Contraseña Incorrecta...");

                }

                else

                    MessageBox.Show("Error:" + e.Error.Message.ToString());       

    }

     De esta forma me autentico con el usuario del AD

    Para obtener un listado de los usuarios del AD por medio de un filtro huso el sig Metodo web:

    public class UsuariosAD //Esta clase la uso para almacenar el listado, y es la que retorna el metodo web

    {

       public string Cve_Usuario { get; set; }

       public string Cmp_NombreCompleto { get; set; }

       public string Cmp_Apellidos { get; set; }

       public string Cmp_Nombre { get; set; }

    }

      

    [OperationContract]

    public List<UsuariosAD> estraerUsrsAD(string criteria, string username, string pwd)

    {

         string LDAPURL = "LDAP://Midominio.Com";

         Collection<UsuariosAD> usrs = new Collection<UsuariosAD>();      

     

         DirectoryEntry entries = new DirectoryEntry(LDAPURL, username, pwd);

         string Filter;

         Filter = criteria;

         Filter = Filter.Replace("&", "");

         Filter = Filter.Replace("|", "");

         Filter = Filter.Replace("*", "");

         string FilterByName = "(CN=*{0}*)";

         string f = string.Empty;

         //if (Type == LDAPFilterType.OnlyUsers) El filtro lo hago unicamente por usuario, pero pueder ser por grupos o derechos del usuario

         f = "(&(objectCategory=person)(objectClass=user){0})";

         if (Filter == string.Empty)

         {

                filter = string.Format(f, string.Empty);

         }

         else

         {

                filter = string.Format(f, string.Format(FilterByName, Filter));

         } 

         DirectorySearcher searcher = new DirectorySearcher(entries, filter);

            int x = searcher.PageSize;

            try

            {

                foreach (SearchResult result in searcher.FindAll())

                {

                    usrs.Add(new UsuariosAD()

                    {

                        Cve_Usuario = (string)result.Properties["samAccountName"][0],

                        Cmp_NombreCompleto = (string)result.Properties["CN"][0],

                        Cmp_Apellidos = (string)result.Properties["SN"][0], //Todo funciona bien, pero si hay un usuario que no trae apellidos me marca errorres, si encuentran una solucion me avisan jejeje...

                        Cmp_Nombre = (string)result.Properties["givenName"][0]

                    });

                }

            }

            catch (Exception ex)

            {

                //Mensaje de error....

            }       

            return usrs.ToList(); //retorno la clase como una lita...

        }

     Codigo en silverligh para invocar el metodo web

    ServicioClient proxy = new ServicioClient();

    proxy.estraerUsrsADCompleted += new EventHandler<estraerUsrsADCompletedEventArgs>(listaUsuariosAD);

    proxy.estraerUsrsADAsync(txtCriterioBusqueda.Text.Trim(), txtMyUsr.Text.Trim(), txtMyPwd.Password.Trim());

     

    void listaUsuariosAD(object sender, estraerUsrsADCompletedEventArgs e)

    {

          if (e.Error == null)     

                    dtgDatos.ItemsSource = e.Result; //aca obtengo el listado y listo para manipularlo

          else

                MessageBox.Show("Error:" + e.Error.Message.ToString());

    }

     

    Bueno, esto es lo que hice, no es lo mas optimo ni quiza lo mas factible, pero me funciona OK, si le pueden agregar o quitar para su mejor funcionamiento les agradeceria muchisimo me lo hicieran saber..

     

    saludos y espero sirva de algo....

     Nota: se me olvidaba, para que funcionen tenemos que agregar la referencia using System.DirectoryServices esta agregar los metodos para trabajar con el AD.

    • Marcado como respuesta javierTR viernes, 10 de diciembre de 2010 18:33
    viernes, 10 de diciembre de 2010 18:32