Autenticación por formularios en ASP.NET

Lunes, 19 oct, 2009 @ 10:59 | Por Dario Krapp | AJAX, ASP.NET, Seguridad
Páginas: 1 2 3

AJAX

Hay un último detalle que no quería dejar fuera del articulo y está relacionado con el uso de javascript, AJAX y autenticación por formularios, ya que imagino que habrá quien esté interesado en realizar la autenticación que hemos visto utilizando este esquema.

Si bien utilizar AJAX para realizar esta tarea no es complejo, lo que es aún mejor es que esta posibilidad ya ha sido considerada bajo lo que se ha denominado como Servicio de autenticación AJAX de ASP.NET (o ASP.NET AJAX Authentication Service).

Para utilizar el servicio de autenticación AJAX deberemos en primera instancia activar y configurar el servicio web de autenticación y luego utilizarlo desde el cliente mediante javascript y las librerías de AJAX de ASP.NET.

Para establecer el servicio web deberemos simplemente agregar en el archivo de configuración web.config (al mismo nivel del tag system.web) lo siguiente:

<system.web.extensions>
  <scripting>
    <webServices>
      <authenticationService enabled="true" requireSSL ="false" />
    </webServices>
  </scripting>
</system.web.extensions>

Luego utilizaremos las librerías de AJAX desde javascript para acceder al servicio web, para lo que deberemos incluir el control ScriptManager en cada página que deba acceder al servicio de autenticación desde javascript (de más está decir que existen formas de evitar el tener que agregar un control ScriptManager en cada página que deba acceder al servicio, pero lo explicaremos de esta forma para mantener el ejemplo lo más simple posible).

Nuestra intención en este punto será crear las versiones AJAX de autenticación por formularios para la autenticación (login) y desautenticacion (logout) tal como lo habíamos hecho previamente desde el servidor utilizando las clases Membership y FormsAuthentication.

Como comentamos previamente ASP.NET nos brindará una serie de funciones javascript que nos ayudarán a realizar estas tareas, para el caso del servicio de autenticación AJAX utilizaremos el namespace Sys.Services.AuthenticationService, donde encontraremos entre otras cosas, una función llamada login y otra llamada logout.

Crearemos nuevamente los cuadros de texto para el ingreso de las credenciales del usuario y un botón “Ingresar” de la siguiente forma:

<body>
  <form ….>
    <asp:ScriptManager ID="ScriptManager1" runat="server"/>
    <table>
        …..
                Usuario:
                <asp:TextBox runat="server" ID="txtUsuario" />
 	….
                Clave:
                <asp:TextBox runat="server" ID="txtClave" TextMode="Password" />
 	….
                <input type="button" onclick="Autenticar();" value="Aceptar" />
 	….
    </table>

Y luego definimos el siguiente código javascript:

function FuncLoginCompleted(EsAutenticado, Contexto, Metodo) {
            if (EsAutenticado) {                Sys.Services.AuthenticationService.get_defaultUserContext();
            }
            else {
                alert("Usuario o clave incorrecta");
            }
        }
        function FuncFailed(Error, Contexto, Metodo) {
            alert("Se ha producido un error: ");
        }
        function Autenticar() {
            Sys.Services.AuthenticationService.login($get("txtUsuario").value, $get("txtClave").value, false, null, "Default.aspx", FuncLoginCompleted, FuncFailed, null);
        }

Veremos que la autenticación funciona correctamente. Si observamos la función login notaremos que posee una amplia variedad de parámetros tales como:

  • userName: Nombre del usuario a autenticar
  • password: Clave del usuario a autenticar
  • isPersistent: Indicará si la autenticación persistirá luego de cerrarse la sesión. (Equivalente a la opción RememberMe existente en el control login de ASP.NET).
  • redirectUrl: Pagina de redirección en caso que la autenticación haya sido satisfactoria.
  • loginCompletedCallback y failedCallback: Estos parámetros existen debido a que las operaciones contra servicios web son asincrónicas y para este caso puntual, cuando el resultado de la autenticación sea devuelto por el servicio web, la función loginCompletedCallback será llamada. Si ocasionalmente se ha producido algún error durante el proceso se invocará a la función failedCallback.
  • userContext: Aceptará un objeto que será pasado a las funciones loginCompletedCallback o failedCallback cuando las mismas sean invocadas luego que el servicio web haya autenticado al usuario o un error se haya producido.

Por otra parte la función loginCompletedCallback invocada poseerá los siguientes parámetros:

  • validCredentials: Devolverá un valor booleano indicando si la autenticación fue exitosa (lo hemos llamado EsAutenticado en nuestro ejemplo).
  • userContext: Devolverá el objeto que se la ha establecido en el parámetro userContext del la función login (lo hemos llamado Contexto en nuestro ejemplo).
  • methodName: Indicará el nombre del método que se ha llamado (lo hemos llamado Metodo en nuestro ejemplo).

Mientras que la función failedCallback invocada poseerá los parámetros:

  • error: Indicará el error que se ha producido
  • userContext: Devolverá el objeto que se la ha establecido en el parámetro userContext de la función login (lo hemos llamado Contexto en nuestro ejemplo)
  • methodName: Indicará el nombre del método que se ha llamado (lo hemos llamado Metodo en nuestro ejemplo)

Con el ingreso (login) funcionando correctamente podremos redefinir la versión AJAX desautenticacion (logout) de la siguiente manera:

<body>
    <form ….>
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <input type="button" onclick="Salir();" value="Salir" />
    </form>
</body>

Con el siguiente código javascript:

function Salir() {
            Sys.Services.AuthenticationService.logout(null, null, FuncFailed, null);
        }
        function FuncFailed(error, Contexto, Metodo) {
            alert("Se ha producido un error");
        }

La función logout tomará los siguientes parámetros:

  • redirectUrl: Redireccion Pagina de redirección en caso que la salida del sistema haya sido satisfactoria.
  • logoutCompletedCallback y failedCallback: La función logoutCompletedCallback será llamada luego que el servicio web ha sacado al usuario. Si ocasionalmente se ha producido algún error durante el proceso se invocará a la función failedCallback.
  • userContext: Aceptará un objeto que será pasado a las funciones logoutCompletedCallback o failedCallback cuando las mismas sean invocadas luego que el servicio web haya desautenticado al usuario o se haya producido algún error.

Y Finalmente la función logoutCompletedCallback invocada poseerá los siguientes parámetros:

  • result: Sin uso
  • userContext: Devolverá el objeto que se la ha establecido en el parámetro userContext de la función logout
  • methodName: Indicará el nombre del método que se ha llamado

Todas estas funciones forman parte de la extensa librería AJAX de ASP.NET y es posible encontrar toda la documentación de la misma en la dirección:

Librería de Microsoft AJAX

De todo lo visto nos queda como conclusión, que la autenticación por formularios conjuntamente con el uso de membrecía nos permitirá crear código claro, rápido, seguro y configurable para realizar las tareas de autenticación y manejo de usuarios, brindándonos también la posibilidad de incluir roles y e información personalizada en este esquema.

Con este último comentario le doy fin al artículo esperando (después de tanto leído) que lo visto sea de utilidad.

VN:F [1.7.3_972]
Rating: 9.4/10 (27 votos cast)
Páginas: 1 2 3

Reciente

  • Discurso de Steve Jobs
  • Llamar a métodos de una página ASP.NET desde JavaScript con jQuery
  • Compartir en Facebook desde nuestra aplicación web
  • Migrar de Google Maps v2 a Google Maps v3
  • Obtener identificador único de dispositivo con Android
  • La psicología del color
  • Geolocalización con HTML 5
  • Cómo firmar un documento PDF desde C# con iTextSharp
  • Obtener lista de contactos de Gmail
  • Pósters de tecnologías y productos de Microsoft
  •  

    6 Respuestas a “Autenticación por formularios en ASP.NET”

      epifannio epifannio dijo:

      Excelente guia funciona perfectamente, un detalle como se puede direccionar a una pagina .aspx específica de acuerdo al tipo de usuario despues de autenticarse?

      VA:F [1.7.3_972]
      Rating: 0.0/5 (0 votos cast)
      Dario Krapp Dario Krapp dijo:

      Muchas gracias Epifannio, el tema es que generalmente un usuario intenta acceder a una página y luego de la autenticación deseará ir a la pagina que había solicitado originalmente, a menos que haya ingresado a la página de login.
      Para hacer que un usuario según alguna condición vaya a una página determinada, la forma que me parece de hacerlo es la siguiente:

      if (Membership.ValidateUser("Usuario1", "Usuario1"))
      {
      FormsAuthentication.SetAuthCookie("Usuario1", false);
      if (Roles.IsUserInRole("Usuario1", "Rol1"))
      Response.Redirect("Default2.aspx");
      else
      Response.Redirect("Default3.aspx");
      }

      El usuario y clave están hardcodeados en este ejemplo para simplificarlo. El único punto a mencionar es que debés utilizar el método SetAuthCookie de la clase estática FormsAuthentication para establecer la cookie de autenticación (el segundo parámetro indicará si la cookie será o no persitetnte).
      En este ejemplo si el usuario pertenece al rol “Rol1″ es redirigido a la pagina “Default2.aspx” y el caso contrario a “Default3.aspx”, pero la condición puede definirse según las necesidades de la aplicación.
      Espero que la respuesta te haya servido.

      VA:F [1.7.3_972]
      Rating: 0.0/5 (0 votos cast)
      epifannio epifannio dijo:

      ok gracias Dario, en un tema que google no me ayudó bastante bien como tú es: Cómo imprimir los datos de un formulario web en asp.net? y mejor si es solo datos por que en los papeles membretados solo hace falta llenar campos vacios al imprimir.

      Te cuento que cuando le doy con “window.print() de javascript” me imprime con cabeceras, pies, botones de la página.

      Dario muchas gracias por tu ayuda..

      VA:F [1.7.3_972]
      Rating: 0.0/5 (0 votos cast)
      Gustavo Cantero (The Wolf) Gustavo Cantero (The Wolf) dijo:

      Epiffanio:
      Para elegir que imprimir y que no de una página web puedes utilizar estilos, la clave es crear estilos distintos para lo que no quieras imprimir. Por ejemplo, supongamos que tenemos una página con un cuadro de texto y un botón, y sólo quieres que se imprima el cuadro de texto:

      <INPUT TYPE="text" name="texto" value="Prueba" />
      <INPUT TYPE="submit" value="enviar"/>

      Para que el segundo control no se imprima puedes crear un estilo dentro del medio “print”, para que sólo se aplique al imprimir:

      @media print
      {
      .noPrint
      {
      display: none;
      }
      }

      BODY
      {
      overflow: hidden;
      .....

      Entonces, nuestro código HTML quedaría así:

      <INPUT TYPE="text" name="texto" value="Prueba" />
      <INPUT TYPE="submit" value="enviar" class="noPrint" />

      Si te fijas en el botón verás que le apliqué el estilo “noPrint” que, en el medio “Print”, hace que no se vea. Ten en cuenta que si quieres aplicar varios estilos a un mismo control puedes hacerlo separando los nombres con espacios, por ejemplo: ‘class=”noPrint botonAzul”‘.
      Espero que se entienda la explicación, cualquier otra duda te invito a nuestro foro donde intentaremos responderte a la brevedad: http://foro.scientia.com.ar.
      Suerte!

      VN:F [1.7.3_972]
      Rating: 5.0/5 (1 voto cast)
      k………………. k................... dijo:

      pueden hacerlo en visual xfis n.n graxias

      VA:F [1.7.3_972]
      Rating: 3.0/5 (2 votos cast)
      julio julio dijo:

      Muy buen artículo. Muy bien explicado, me ha sido de mucha ayuda para comenzar en este tema. Saludos!

      VA:F [1.7.3_972]
      Rating: 0.0/5 (0 votos cast)

    Responder

    XHTML: Puede utilizar estos tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>