vtortola.Net

Abril 27, 2007

ASP.NET 2.0 contra ActiveDirectory. Parte I, la autenticación.

Archivado en: .NET, ASP.NET, ActiveDirectory, C#, Windows — vtortola @ 1:02 pm

Lo prometido es deuda, y me dispongo a contar como realizar la autenticación de usuarios vía usuario@dominio/contraseña contra un ActiveDirectory. Si la aplicación va a funcionar en una intranet no hace falta complicarse tanto y usando la autenticación integrada Windows seria más sencillo, pero la cosa se complica cuando los usuarios deben también poder entrar desde fuera de la intranet

Lo primero, creamos un sencillo proyecto con una página “Default.aspx” y otra “Login.aspx”, añadimos un control ‘Login’ a “Login.aspx”, un ‘LoginStatus’ y un ‘LoginName’ a “Default.aspx”. Vamos a las propiedades de nuestro sitio y configuramos “Default.aspx” como página de inicio. Configuramos la propiedad “DestinationPageUrl” como nuestra página “Default.aspx”, que es donde redireccionará en caso de autenticación correcta.

Ahora añadimos las siguientes secciones a nuestro “Web.config”:

1) ConnectionString.

Tenemos que definir una connection string LDAP para poder realizar el acceso a este servicio. Si no la sabeis, encontré una curiosa función en los foros de ASP.NET para obtener la cadena de conexión LDAP en el que esta nuestro equipo ;)

Una vez obtenida, la añadimos normalmente, asignandole también un nombre descriptivo por el que la recuperaremos después:

<connectionStrings>
<
add name=ADConnString connectionString=LDAP://bankai.vtortola.local/DC=vtortola,DC=local/>
</
connectionStrings>

2) ActiveDirectoryMembershipProvider

Ahora necesitamos comprobar la pertenencia a grupo de nuestro usuario, añadimos un ActiveDirectoryMembershipProvider, que será el que usaremos para autenticar usuarios:

<membership defaultProvider=LDAP>
<
providers>
<
add name=LDAP type=System.Web.Security.ActiveDirectoryMembershipProvider connectionStringName=ADConnString/>
</
providers>
</
membership>

3) Indicamos el sistema de autenticación:

Indicamos que la autenticación sera de tipo “Forms” y que la página de login es “Login.aspx”.

<authentication mode=Forms>
<
forms name=Athentication
path=/
loginUrl=Login.aspx
protection=All
timeout=30 />
</
authentication>

4) Desautorizamos a los usuarios anónimos.

Indicamos que los usuarios anónimos no están autorizados para navegar nuestra aplicación web.

<authorization>
<
deny users=?/>
</
authorization>

5) Damos permisos para directorios especiales.

Una curiosidad, por ejemplo si colocais imágenes en vuestra página “Login.aspx” estas no serán visibles hasta que el usuario se autentique y cuando esto suceda será redireccionado con lo cual nunca será visibles. Esto es debido a que los usuarios no autenticados solo tienen permisos para verlas . Para dejar que puedan acceder a por ejemplo una carpeta ‘Images’, añadimos lo siguiente:

<location path=Images>
<
system.web>
<
authorization>
<
allow users=?/>
</
authorization>
</
system.web>
</
location>

Una vez hecho esto, nos vamos a “Login.aspx”, y hacemos doble click sobre el control ‘Login’ de forma que automáticamente nos lleva a “Login.aspx.cs” en el evento ‘Login1_Authenticate’. Escribimos el siguiente código que pondrá la variable ‘e.Authenticated’ a ‘True’ y por tanto validará al usuario en caso de que el método Membership.Providers["LDAP"].ValidateUser autentique al usuario:

e.Authenticated = Membership.Providers["LDAP"].ValidateUser(Login1.UserName, Login1.Password);

Notad, que en la declaración del Membership Provider indicamos un ‘defaultProvider’, con lo que podriamos acceder a él simplemente de esta forma:

e.Authenticated = Membership.ValidateUser(Login1.UserName, Login1.Password);

Le damos a ejecutar, y al ingresar nuestro login (compuesto por usuario@dominio) y nuestra password deberia redireccionarnos a “Default.aspx”, el control ‘LoginName’ mostrar nuestro nombre de usuario y el control ‘LoginStatus’ darnos la opción de ‘LogOut’ (que nos llevaría de nuevo a “Login.aspx”) …. Más fácil imposible ¡!!

Para conocer el nombre de nuestro usuario autenticado, no hay más que consularlo en la propiedad:

User.Identity.Name;

  En próximos artículos le daremos un uso más extenso a este objeto “User”.

Es imprescindible que echeis un vistazo a los artículos Personalización en ASP.NET 2.0 Parte 1 y Personalización en ASP.NET 2.0 Parte 2 si queréis una visión más extensa de los controles de login.

El lunes seguiré con la segunda parte donde explicaré como usar los roles de usuario y como relacionarlos de forma sencilla con los grupos de ActiveDirectory, de forma que dependiendo del grupo determinados controles y/ó determinadas páginas sean accesibles o no.

6 comentarios »

  1. [...] continuación al artículo ASP.NET 2.0 contra ActiveDirectory. Parte I, la autenticación voy a explicar ahora como integrar los roles de usuario ASP.NET 2.0 con los grupos de [...]

    Pingback por ASP.NET 2.0 contra ActiveDirectory. Parte II, los roles. « WhatTheFuckException was thrown — Abril 30, 2007 @ 3:45 pm

  2. Hola, buscando información acerca de autenticación de los usuarios, llegue hasta aquí, yo estoy usando ASP.NET 2003, Framework 1.1, estoy implementando la seguridad mediante formularios, y he seguido los pasos que leyendo me indican lo leido y consultado:
    En login.aspx

    Private Sub cmdLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdLogin.Click
    ‘Validacion Usuarios.
    If UsuarioValido Then
    ‘ok. generamos un tiquet
    ‘Opcion para realizar la redireccion “a mano”
    FormsAuthentication.SetAuthCookie(txtUsuario.Text, False)
    Response.Redirect(“Paginadondequieroquevaya.aspx”)
    Else
    ‘la cosa no ha ido bien
    lblError.Visible = True
    lblError.Text = “Usuario No Valido”
    End If
    End Sub
    En el Web.config:

    La idea es tener una carpeta privada donde están el Administrador.
    Dentro de esta carpeta tengo otro archivo Web.Config, donde he definido:

    pero, he probado, pero no cuando cierro la sesión con formsAuthentication.SignOut al parecer no elimina el ticket, porque cuando me me envia al login.aspx, estando en esta pagina hago, back en el browser me envia a las pagina anterior, es decir, a la sesión del usuario que acaba de terminar su sesión.
    Alguna sugerencia, cual podría ser el problema?
    gracias, de antemano por tu ayuda.

    comentario por Yhire — Mayo 15, 2007 @ 5:11 pm

  3. Partiendo de que no tengo ni idea ni de VB y que yo aprendí directamente .NET 2.0 … no se que decirte xD

    comentario por vtortola — Mayo 16, 2007 @ 8:07 am

  4. ohhh, ok. muchas gracias.

    comentario por Yhire — Mayo 16, 2007 @ 12:22 pm

  5. Es posible acceder a toda la informacion del activeDirectory desde asp.net?
    Saludos cordiales…

    comentario por Enrique Davila — Junio 14, 2007 @ 6:05 pm

  6. En principio si, siempre que el usuario que utilices tenga permisos para ello y realizes las queries oportunas. Mira este ejemplo donde hago una clase derivada de RoleProvider para interrogar al AD sobre la pertenencia a grupo de usuarios:

    http://vtortola.wordpress.com/2007/04/30/aspnet-20-contra-activedirectory-parte-ii-los-roles/

    Un saludo.

    comentario por vtortola — Junio 14, 2007 @ 6:20 pm


Canal RSS de los comentarios de la entrada. URI para TrackBack.

Deja un comentario

Tienes que iniciar sesión para escribir un comentario.

Blog de WordPress.com.