none
Autenticación mediante Active Directory RRS feed

  • Pregunta

  • Que tal. 

    Pues ya he intentado de todo y ahorita estoy probando un código para autenticación con credenciales de Active Directory, tengo un error en el boton, el código a continuación.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Text;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.DirectoryServices;
    
    using System.Data;
    using System.Configuration;
    using System.Collections.Specialized;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.IO;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    using System.DirectoryServices.ActiveDirectory;
    
    public class LdapAuthentication
    {
        private string _path;
        private string _filterAttribute;
    
        public LdapAuthentication(string path)
        {
            _path = path;
        }
    
        public bool IsAuthenticated(string domain, string username, string pwd)
        {
            string domainAndUsername = domain + @"\" + username;
            DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
    
            try
            {
                //Bind to the native AdsObject to force authentication.
                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;
                }
    
                //Update the new path to the user in the directory.
                _path = result.Path;
                _filterAttribute = (string)result.Properties["cn"][0];
            }
            catch (Exception ex)
            {
                throw new Exception("Error authenticating user. " + ex.Message);
            }
    
            return true;
        }
    
        public string GetGroups()
        {
            DirectorySearcher search = new DirectorySearcher(_path);
            search.Filter = "(cn=" + _filterAttribute + ")";
            search.PropertiesToLoad.Add("memberOf");
            StringBuilder groupNames = new StringBuilder();
    
            try
            {
                SearchResult result = search.FindOne();
                int propertyCount = result.Properties["memberOf"].Count;
                string dn;
                int equalsIndex, commaIndex;
    
                for (int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
                {
                    dn = (string)result.Properties["memberOf"][propertyCounter];
                    equalsIndex = dn.IndexOf("=", 1);
                    commaIndex = dn.IndexOf(",", 1);
                    if (-1 == equalsIndex)
                    {
                        return null;
                    }
                    groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
                    groupNames.Append("|");
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error obtaining group names. " + ex.Message);
            }
            return groupNames.ToString();
        }
    
    }
    public partial class Login : System.Web.UI.Page
    {
        
    
        protected void Page_Load(object sender, EventArgs e)
        {
            
        }
    
        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            string adPath = "LDAP://148.226.0.0/DC=miempresa,DC=com,DC=mx";
            LdapAuthentication adAuth = new LdapAuthentication(adPath);
            try
            {
                if (true == adAuth.IsAuthenticated(txtDominio.Text, txtUsuario.Text, txtContraseña.Text))
                {
                    String groups = adAuth.GetGroups();
    
                    
    ---------------->bool isCookiePersistent = chkPersist.Checked;
                    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, txtUsuario.Text,
                  DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
    
                    String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    
                    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    
                    if (true == isCookiePersistent)
                        authCookie.Expires = authTicket.Expiration;
    
                    Response.Cookies.Add(authCookie);
    
                    Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsuario.Text, false));
                    Response.Redirect("inicio.aspx");
                }
                else
                {
                    lblError.Text = "Error compruebe usuario y/o contraseña.";
                }
            }
            catch (Exception ex)
            {
                lblError.Text = "Error autenticación. " + ex.Message;
            }
        }
    }

    Todo está dentro del Login.aspx.cs, el pedazo de código que está marcado con una flecja ---> es el que me da problema... alguien podría ayudarme.

    martes, 12 de abril de 2016 18:26

Respuestas

  • Aqui refiero la página del Login.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <style type="text/css">
            .auto-style1 {
                width: 100%;
            }
            .auto-style2 {
                width: 183px;
            }
        </style>
    </head>
    <body style="width: 531px; height: 111px">
        <form id="form1" runat="server">
        <div>
        
            <table class="auto-style1">
                <tr>
                    <td class="auto-style2">DOMAIN</td>
                    <td>
                        <asp:TextBox ID="txtDominio" runat="server" Width="227px"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="auto-style2">USUARIO</td>
                    <td>
                        <asp:TextBox ID="txtUsuario" runat="server" Width="227px"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="auto-style2">PASSWORD</td>
                    <td>
                        <asp:TextBox ID="txtContraseña" runat="server" TextMode="Password" Width="227px"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="auto-style2">&nbsp;</td>
                    <td>
                        <asp:Label ID="lblError" runat="server"></asp:Label>
                    </td>
                </tr>
            </table>
        
        </div>
            <asp:Button ID="btnAceptar" runat="server" OnClick="btnAceptar_Click" Text="Logon" />
        </form>
    </body>
    </html>
    

    • Marcado como respuesta Manu Mrls jueves, 2 de junio de 2016 17:28
    martes, 12 de abril de 2016 19:01
  • Efectivamente no tienes definido ese control. Si quieres que siempre se persista la cooki establece

    bool isCookiePersistent = true;


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Manu Mrls martes, 12 de abril de 2016 21:49
    martes, 12 de abril de 2016 19:25
    Moderador

Todas las respuestas

  • hola. Deberías especificar qué problema tienes. Algún mensaje de error? Se lanza una excepción?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de abril de 2016 18:36
    Moderador
  • Hola.

    La excepcion que me manda al ejecutar es:

    El nombre "chkPersist" no existe en el contexto actual...

    martes, 12 de abril de 2016 18:39
  • Tienes definido algún chkPersist en la Pagina? Podemos ver tu codigo Aspx? Recuerda que c# es sensible a mayúsculas y minúsculas. Tal vez tu control se llama ChkPersist en vez de chkPersist por ejemplo

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de abril de 2016 18:43
    Moderador
  • sucede que estoy usando un código que encontré, y una parte como está en el código de arriba que tiene flecha (--->) es el código que me da ese problema, yo pensé en definir esa variable, pero al definirla me manda mas problemas... 
    bool isCookiePersistent = chkPersist.Checked;
    martes, 12 de abril de 2016 18:46
  • Me comentan que Leandro tuttini que se puede hacer lo mismo con Windows Authentication... Pero me pidieron que usara la autenticacion con active.
    martes, 12 de abril de 2016 18:49
  • se supone que chkPersist es un checkbox definido en la pagina de Login. Si no defiens ese checkbox normal que te de problemas. Por eso te solicito que nos escribas como está el codigo de tu pagina aspx

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de abril de 2016 18:54
    Moderador
  • Aqui refiero la página del Login.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <style type="text/css">
            .auto-style1 {
                width: 100%;
            }
            .auto-style2 {
                width: 183px;
            }
        </style>
    </head>
    <body style="width: 531px; height: 111px">
        <form id="form1" runat="server">
        <div>
        
            <table class="auto-style1">
                <tr>
                    <td class="auto-style2">DOMAIN</td>
                    <td>
                        <asp:TextBox ID="txtDominio" runat="server" Width="227px"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="auto-style2">USUARIO</td>
                    <td>
                        <asp:TextBox ID="txtUsuario" runat="server" Width="227px"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="auto-style2">PASSWORD</td>
                    <td>
                        <asp:TextBox ID="txtContraseña" runat="server" TextMode="Password" Width="227px"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="auto-style2">&nbsp;</td>
                    <td>
                        <asp:Label ID="lblError" runat="server"></asp:Label>
                    </td>
                </tr>
            </table>
        
        </div>
            <asp:Button ID="btnAceptar" runat="server" OnClick="btnAceptar_Click" Text="Logon" />
        </form>
    </body>
    </html>
    

    • Marcado como respuesta Manu Mrls jueves, 2 de junio de 2016 17:28
    martes, 12 de abril de 2016 19:01
  • Efectivamente no tienes definido ese control. Si quieres que siempre se persista la cooki establece

    bool isCookiePersistent = true;


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Manu Mrls martes, 12 de abril de 2016 21:49
    martes, 12 de abril de 2016 19:25
    Moderador
  • Muchas gracias, el problema se arregló... mi otro problema es que no autentica correctamente. Algún comentario sobre mi código?

    martes, 12 de abril de 2016 21:50
  • La cadena de consulta LDAP

            string adPath = "LDAP://148.226.0.0/DC=miempresa,DC=com,DC=mx";
           

    es correcta? Se supone que esa IP es de tu servidor Controlador de dominio...


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de abril de 2016 21:58
    Moderador
  • Puse esos datos para publicar el código... 40.122.51.184 la cadena LDAP es:

    String adPath = "LDAP://40.122.51.184/DC=intra,DC=laboratoriosab,DC=mx"

    ...y si se supone que esla ip del servidor, pero no estoy seguro que asi sea correcto... el ejemplo es:

    "LDAP://yourCompanyName.com/DC=yourCompanyName,DC=com";

    martes, 12 de abril de 2016 22:33
  • Me pasaron otro ejemplo del LDAP:

    string LDAP = "LDAP://40.122.51.184:389/DC=" + domain + ",DC=intra,DC=laboratoriosab,DC=mx";

    La verdad apenas estoy empezando a programar...

    Otra duda, todo mi código como el de arriba está en Login.aspx.cs, no hay problema?

    martes, 12 de abril de 2016 22:38