DotNetcr.com
Si deseas hacer un intercambio de links con DotNetcr, escríbenos aquí
Recibe las actualizaciones vía RSS
Te invitamos a unirte en nuestras redes
   http://www.facebook.com/DotNetcr
   http://www.twitter.com/dotnetcr

Creando un Sistema Web con Autenticación Forms en C# .Net 2005

Por h@nz | 10/26/2006 | Visitas 44,231 | Voto 4.00
Este documento muestra la forma de acceder a una aplicación Web usando autenticación por Formularios, algún control de .NET y buenas prácticas en lenguaje C# y con una Base de Datos SQL Server 2005 tratando de ser lo más claro y explicativo posible.
Categorías : C#, ASP.NET, SQL Server
Descargar ejemplo Demo_Acceso.zip

¿Porque C# y no Visual Basic?... simple, Microsoft esta tratando de guiar las tendencias hacia este lenguaje, y lo esta consiguiendo, así, existe mucha documentación en C#, además, he comprobado que cuando programamos en VB .NET, normalmente utilizamos algunas instrucciones de VB 6, entonces, no aprovechamos al máximo el FrameWork de .NET. Para comprobar esto, bastaría con mencionar que cuando creamos un proyecto en VB .NET no nos molestamos en quitarle la Referencia de Microsoft.VisualBasic, que trae el soporte para compatibilidad con VB 6 y que nos permite ejecutar algunas instrucciones que son propias de Visual Basic 6. Por esta razón, conviene o quitarse definitivamente todas las costumbres de VB 6 y empezar a escribir bien VB .NET o nos sumergimos en C#, que nos quita todas esas costumbres y de paso nos damos cuenta que no es tan complicado como parece al principio.

Para empezar, iniciaremos un Sitio Web y le llamaremos DemoAcceso tal y como se muestra en la siguiente imagen.



Siempre es recomendable utilizar otra unidad que no sea la unidad C para trabajar. Recordemos que al dejar la opción Ubicación en "Sistema de Archivos" no tenemos el problema de la versión anterior de .NET, porque la versión 2005 incluye un Servidor Web que podemos utilizar en nuestro ambiente de desarrollo sin necesidad de tener instalado el IIS, pero si será necesario el IIS cuando pasemos al ambiente de producción.

Al iniciar el proyecto tendremos la siguiente ventana, en la que se puede ver una Carpeta ASP .NET (se llama así porque es el framework quien la administrará y cada carpeta ASP .NET cumple un papel específico) de nombre App_Data, dentro de la cual se colocará nuestra Base de Datos. Además esta presente la página Default.aspx, que contiene la interfaz de Usuario, o sea la página web propiamente que los visitantes de nuestro Web verán. Hay que aclarar que por cada página que se cree se creará además por defecto un archivo con el mismo nombre y con extensión según el lenguaje (para el caso de C# será .cs, para Visual Basic será .vb, etc.) que contendrá el código que ejecutaremos por cada evento que se trabaje en la página.

Lo primero que haremos será crear nuestra Base de Datos y una tabla con el nombre Usuarios, que será la que contiene los datos de los usuarios con acceso a nuestra aplicación Web.

Haga clic sobre la carpeta ASP .NET llamada App_Data y ha continuación con el clic derecho del mouse sobre esta carpeta seleccione la opción Agregar nuevo Elemento, en la ventana que se mostrará a continuación seleccione el icono Base de Datos SQL y escriba el nombre Acceso.mdf tal como se muestra en la siguiente pantalla.



Luego de haber hecho esto se deberá cargar el Explorador de Servidores (si no se muestra, haga clic en el Menú Ver, opción Explorador de Servidores). Esta ventana muestra la Base de Datos que hemos creado, las carpetas corresponden a los diferentes Objetos de la Base de Datos que podemos crear. Es mas, ni siquiera necesito abrir el Servidor de SQL Server para probar mi aplicación como veremos en el presente manual; este archivo MDF que hemos creado también se podrá visualizar en el Explorador de Soluciones (no confundir Explorador de Soluciones, que muestra los archivos de nuestro proyecto, con el Explorador de Servidores, que muestra los diferentes Equipos de cómputo y de Datos que podemos utilizar).

Ahora, que ya tenemos nuestra Base de Datos, debemos crear nuestra tabla Usuarios. Sobre la carpeta Tablas del Explorador de Servidores haga clic con el botón derecho del mouse y seleccione la opción Agregar Nueva Tabla. Cree los campos login_usu y pass_usu para que quede como muestra la siguiente imagen. A decir verdad, esta pantalla es bastante intuitiva, de manera que no creo que tengan muchos problemas para crear la tabla. No se olviden de hacer clic en el botón Establecer Clave Principal en el campo login_usu, aunque Uds. Pueden considerar otros nombres de campos, esta es solo una recomendación.



Una vez hecho esto, haga clic en el botón Guardar (el clásico con forma de Disquete) y asigne a la tabla creada el nombre Usuarios.

Cierre la ventana de la tabla para a continuación crear un Procedimiento Almacenado que valide las entradas desde nuestro Sitio Web. Para hacerlo haga clic con el botón derecho del mouse sobre la carpeta Procedimientos Almacenados, y seleccione la opción Agregar Nuevo Procedimiento Almacenado. Se mostrará una ventana en la cual se puede escribir el SP (Stored Procedure). Una buena práctica consiste en no colocar el prefijo sp al Procedimiento almacenado, ya que estas siglas significan System Procedure y no Stored Procedure, como algunos pudieran pensar, de manera que le toma más tiempo al motor de base de datos ejecutarlo.

A continuación escriba el Siguiente código:

ALTER PROCEDURE dbo.usp_VerificarUsuario
(
@user varchar(15),
@pass varchar(15),
@res bit OUTPUT
)
AS

SET NOCOUNT ON

if (select top 1 count(*) from usuarios
where cast(login_usu as varbinary) = cast(@user as varbinary)
and cast(pass_usu as varbinary) = cast(@pass as varbinary)) = 1
set @res = 1
else
set @res = 0

RETURN 0


Hecho esto haga clic en el botón Guardar (si, ese de figura de Disquete). Como se darán cuenta, recibimos los parámetros @user y @pass, además tenemos un parámetro de salida de tipo bit que indicará si el usuario existe o no.

Una de las reglas de las buenas prácticas es que NUNCA se debe usar una instrucción SQL en la página Web, de manera que, cualquier instrucción SQL se debe hacer mediante Stored Procedures, de esa manera evitaremos ataques de SQL Injection en nuestras aplicaciones Web. Lo que ocurre con lo parámetros es que pasan a ser reconocidos por el SQL Server como elementos específicos y no se interpretarán como parte de la cadena de ejecución, en el caso anterior los parámetros @user y @pass además de esto se están convirtiendo al tipo de datos varBinary, de esa manera, el texto enviado no podrá afectar nuestra aplicación por un ataque de SQL Injection. Aunque esto parezca redundante, nunca esta de mas incrementar la seguridad de nuestras aplicaciones.

Ahora vamos a configurar nuestra aplicación Web para que le podamos dar una Autenticación por Formularios. Abra el Explorador de Soluciones y haga clic con el botón derecho del mouse sobre el primer elemento que se ve (Siempre se muestra la ruta del Sitio Web, en mi caso D:\Training\DemoAcceso) y haga clic en la opción Agregar Nuevo Elemento, en la ventana que se mostrará seleccione el icono Archivo de Configuración Web, por defecto el archivo tiene el nombre Web.Config, no cambie el nombre del archivo y haga clic en el botón Agregar. El Explorador de Soluciones se debe ver como se muestra en la imagen de la derecha.

El archivo Web.Config, es un archivo de Configuración para la aplicación que estamos creando y para cada carpeta. Pero debemos hacerle algunos cambios. Para empezar notará que existe una etiqueta igual a esta: <connectionStrings/>, esta etiqueta debe ser reemplazada por la siguiente instrucción:

<connectionStrings>
<add name="DemoAcceso"
providerName="System.Data.SqlClient"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Training\DemoAcceso\App_Data\Acceso.mdf;Integrated Security=True;User Instance=True"/>
</connectionStrings>


Explicando: Dentro de las etiquetas connectionStrings se pueden configurar las cadenas de conexión que se usarán en la aplicación. Cada cadena se agregará con la etiqueta add que tiene los atributos name (que identificará a la cadena de conexión), providerName (que indicará el tipo de proveedor para esa cadena, por ej. Para sql, para oracle, etc.) y el atributo connectionString (que se utiliza para indicar la cadena de conexión).

Además de este cambio, debemos hacer lo siguiente, dentro del mismo archivo Web.Config se mostrará la siguiente etiqueta: <authentication mode="Windows" />, esta debe ser reemplazada por las siguientes líneas:

<authentication mode="Forms">
<forms loginUrl="Login.aspx" defaultUrl="Sistema/Inicio.aspx" />
</authentication>


El elemento authentication permite indicar el tipo de autenticación para nuestra aplicación, en nuestro caso será la Autenticación por Formularios, aunque existen otras formas, pero no son motivo de este artículo.

Autenticación significa que debemos identificar, quién es el visitante. No debemos confundir con Autorización que se refiere a verificar cuales son los recursos que puede usar un visitante que ya ha sido autenticado.

También encontraremos lo siguiente:

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>


Esta en color verde, porque esta como comentario, lo mejor será quitarlo de allí y hacer que quede de la siguiente manera:

<customErrors mode="RemoteOnly" defaultRedirect="Error.htm">
<!--
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
-->
</customErrors>


Con esto nos aseguramos que al producirse un error nos muestre automáticamente una página hecha por nosotros, la cual no debe contener muchos detalles sobre el error (de preferencia, ninguno). El atributo mode tiene el valor RemoteOnly, lo que indica que solo se redireccionará a la página indicada si se trata de acceder a dicha página en forma remota, mientras que, de forma local, se mostrará el seguimiento completo del error, que puede servir, en la etapa de desarrollo.

Una característica que tiene ASP .NET es que cuando se produce un error no controlado, la página Web muestra el Seguimiento completo del error, indicando al visitante parte del código que generó el error y todo lo que hizo el .Net framework antes de que ocurra dicho error.

Esto, aunque parezca un detalle sin mucha importancia, es el motivo por el cual, muchas páginas Web de Empresas importantes han caído, porque se producían estos mensajes en la página Web y usuarios malintencionados con ciertos conocimientos técnicos usaban esta información para acceder a los servidores.

Ahora debemos crear una página Web llamada Login.aspx en la raiz de la aplicación; luego crearemos una nueva carpeta (no carpeta de ASP NET, sino una común y silvestre) llamada Sistema y agregaremos una página llamada Inicio.aspx y un Archivo de Configuración Web con el nombre por defecto Web.Config. El explorador de Soluciones debe quedar como se muestra en el gráfico de la derecha.

En el archivo Web.Config de la carpeta Sistema debemos escribir las siguientes instrucciones:

<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>


Este archivo no es muy diferente del archivo principal, pero sirve, a diferencia del anterior para configurar la carpeta Sistema indicándole que todos los usuarios no autenticados no podrán ingresar a ver las páginas de esa carpeta.

Ahora, hemos llegado a la etapa de la creación de las Capas de Programación, para esto agregue la Carpeta de ASP NET llamada App_Code, esta carpeta se usa para escribir aquí las clases que conformarán lo lógica del sistema.

Dentro de esta carpeta crearemos las carpetas DataAccess (para las clases de acceso a Datos) y BusinessLogic (para las clases que contendrán la lógica de Negocios). Sobre la Carpeta DataAccess haga clic con el botón derecho del mouse y seleccione la opción Agregar Nuevo Elemento y seleccione el icono clase, a continuación escriba el nombre Dal_Acceso.cs (el prefijo Dal se refiere a Data Access Layer, o sea Capa de Acceso a Datos) para la nueva clase. Aunque en este proyectito no se utilizarán Clases que controlen la lógica del negocio, es bueno tenerla presente, ya que las validaciones y operaciones que no tienen que ver con la BD se deben hacer en clases que deben estar en esta carpeta.

El Explorador de Soluciones, esta vez, debe quedar como se muestra en la figura de la izquierda.

Aunque toda esta serie de pasos resultan, aparentemente muy engorrosos, resulta necesario pues forma parte de las Buenas Prácticas que hay que tener en cuenta en programación, no solo con .NET, sino también con cualquier otra herramienta o lenguaje Orientado a Objetos.

Ahora, en la clase Dal_Acceso.cs se debe escribir el siguiente código:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

/// <summary>
/// Dal_Acceso: Se usa para verificar si un usuario existe o no en la Base de Datos
/// </summary>

public class Dal_Acceso
{
private SqlConnection cnn;
private Boolean autorizado = false;

public Dal_Acceso()
{
cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["DemoAcceso"].ConnectionString);
}

public Boolean Autorizado
{
get
{
//throw new System.NotImplementedException();
return autorizado;
}
}

public void VerificarAcceso(String usuario, String password)
{
try
{
SqlCommand cmd = new SqlCommand("usp_VerificarUsuario", cnn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@user", SqlDbType.NVarChar, 15);
cmd.Parameters["@user"].Value = usuario;

cmd.Parameters.Add("@pass", SqlDbType.NVarChar, 15);
cmd.Parameters["@pass"].Value = password;

cmd.Parameters.Add("@res", SqlDbType.Bit);
cmd.Parameters["@res"].Direction = ParameterDirection.Output;

cnn.Open();
cmd.ExecuteNonQuery();
autorizado = Convert.ToBoolean(cmd.Parameters["@res"].Value);
cmd.Dispose();
cnn.Close();
}
catch (Exception)
{
throw;
}
}
}


Nótese que le hemos agregado la referencia a System.Data.SqlClient que es donde se encuentran todos los objetos necesarios para acceder a las Bases de Datos de SQL Server.

Como se puede observar tenemos un Constructor que instancia un objeto de tipo conexión. El ConfigurationManager administra las cadenas de conexión escritas en el Archivo de Configuración Web, de manera que solo le indicamos el nombre tal como lo escribimos en el Web.Config.

Esta clase tiene también la propiedad de solo lectura Autorizado de tipo lógico (verdadero o falso), que se usará para determinar si el usuario puede o no ingresar a la Aplicación.

Ahora, nótese que hemos utilizado la instrucción try para control de errores, en este caso lo hemos dejado en blanco, es decir, sin controlar el error como es debido ya que me di cuenta de este detalle al terminar este artículo y la verdad ya me dio pereza hacer algo al respecto, así que hablare sobre eso en otra oportunidad... je je je, ay! h@nz, que flojo!

El método VerficarAcceso se usará para recibir el nombre de usuario y contraseña que el usuario ha escrito en la página principal y hacer la comparación con la Base de Datos, llamando al Procedimiento Almacenado que ya hemos creado, mientras que la propiedad Autorizado retornará un valor lógico indicando si el usuario es o no válido. Ahora trabajaremos con la parte del cliente, que por cierto, después de todo esto, será mucho más fácil.

En la página Default.aspx agregaremos un control HyperLink y escribiremos en su propiedad Text el valor: Visitar la página principal del Sistema. Luego haga clic en el botón punteado que aparece en la propiedad NavigateURL para mostrar la ventana que se ve en el lado derecho.



A continuación seleccione la carpeta Sistema en la sección izquierda y luego la página Inicio.aspx en la sección derecha de la ventana.

Una vez hecho esto se hará clic en el botón aceptar.

Con esto, ha quedado definido un enlace a través de este control HyperLink entre la página principal y la página de Inicio de nuestro sistema. Ahora haga lo mismo en la página Inicio.aspx, es decir, agregue un objeto HyperLink en la página Inicio.aspx que dirija a la página Default.aspx.

Hasta aquí todo quedaría muy bien, pero recordemos que la carpeta Sistema tiene un archivo Web.config en el cual se indica que solo podrán acceder a esta carpeta para visualizar las diferentes páginas aquellos usuarios que estén autenticados. De manera que si tratamos de ejecutar nuestra aplicación, al hacer clic en el vínculo para ir a la página Sistema/Inicio.aspx nos redireccionará a la página de Login.

Ahora solo necesitamos escribir algo más en la página de Login y habremos terminado.



En este gráfico se puede ver la página Login.aspx, en la cual se ha dibujado un control Login, este control esta disponible dentro de las categorías Inicio de sesión del Cuadro de herramientas. Si desea darle un formato predefinido puede hacer clic en el icono que se encuentra en la parte superior derecha del control, (en el gráfico se ha encerrado con un círculo rojo) y seleccionando la opción Formato Automático.

Cámbiele el nombre al control (con la propiedad ID de la ventana de propiedades) y asígnele el nombre LogAcceso. Hecho esto, haga doble clic sobre el control para escribir el poquísimo código que nos hace falta, bueno, es un decir.

En la ventana de código escriba lo siguiente:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
Response.Redirect("Sistema/Inicio.aspx");
}
}

protected void LogAcceso_Authenticate(object sender, AuthenticateEventArgs e)
{
Dal_Acceso x = new Dal_Acceso();
x.VerificarAcceso(Server.HtmlEncode(LogAcceso.UserName), Server.HtmlEncode(LogAcceso.Password));
e.Authenticated = x.Autorizado;
}
}


Ahora expliquemos esta última parte. HttpContext.Current.User.Identity.IsAuthenticated es una propiedad de solo lectura que devuelve un valor true si el usuario actual esta autenticado y devuelve false si el usuario no esta autenticado. De manera que si al cargar la página, el usuario esta autenticado, se redireccionará a la página de Inicio del sistema.

El Evento LogAcceso_Authenticate corresponde al evento de autenticación del objeto LogAcceso que habíamos creado. En este evento, se instancia un objeto de la clase Dal_Acceso (que ya hemos creado y que contiene la funcionalidad para la verificación con la base de datos) con la siguiente línea:

Dal_Acceso x = new Dal_Acceso();


La siguiente línea invoca a nuestro método VerificarAcceso que se ha escrito en la clase de Acceso a Datos. Ahora lo importante aquí es lo siguiente: Server.HtmlEncode(LogAcceso.UserName)

LogAcceso.UserName contiene el nombre de usuario que el visitante ha escrito en el control Login; pero ¿porque agregar Server.HtmlEncode? La respuesta es simple, esta instrucción permite codificar algunos caracteres HTML potencialmente peligrosos que hubiera en la cadena que el visitante ingresa, para darle un poco más de seguridad a nuestra aplicación entonces, agregamos esta línea y evitamos un posible ataque de Cross Site Scripting. Ejemplo: Si un visitante ingresa el signo <, con esta instrucción se enviará &lt; en su lugar, de esa manera se evitan posibles ataques.

Lo único que nos falta para que nuestra aplicación funcione es ingresar datos de usuario a la tabla, para agregarlos, en el Explorador de Servidores haga clic con el botón derecho del mouse sobre la tabla que tenemos creada y seleccione la opción Mostrar Datos de Tabla. A continuación ingrese al menos un usuario. Ahora si, ya esta lista la aplicación para ser probada.



Espero que este artículo les ayude en algo a entender la programación en .Net y que se entienda el principio de buenas prácticas con la programación en Capas y algo de seguridad para defendernos de SQL Injection y Cross Site Scripting.

Saludos...

El código fuente de este artículo también se adjunta, así que pueden descargarlo para que se ahorren el trabajo de escribir todo el código, aunque recomiendo que lo escriban todo, así se entenderá mejor.

Descargar ejemplo Demo_Acceso.zip
Area de Comentarios
Por Anónimo - Fecha: 2006/10/26 01:13 AM
muy bueno
Por royrojas - Fecha: 2006/11/12 02:33 AM
hanz, muchas gracias por tu aporte, espero que pronto nos vuelvas a colaborar.
Por Anónimo - Fecha: 2006/11/13 10:10 AM
Excelente el artículo, muy bien explicada cada una de las secuencias del desarrollo. Te felicito!
Por Anónimo - Fecha: 2006/11/15 06:28 PM
¡Super!, Muy bien explicado.
Por Anónimo - Fecha: 2006/11/23 12:39 PM
Recien entrando en el mundo de C#...se ve jenial....muchas gracias...se ve super buena tu explicacion
Por Anónimo - Fecha: 2006/12/04 11:00 AM
Cojonudo, muchas gracias.
Por Anónimo - Fecha: 2006/12/06 03:30 PM
Al aplicar los pasos de este articulo, si hago tal como describe, no me valida los usuarios.
Cuando bajo uno de los codigos de ejemplo si me funciona, pero a la hora de cambiar los nombres del procedimiento almacenado o de los parametros o de la tabla, no me valida los datos.
Por h@nz - Fecha: 2006/12/11 08:55 AM
La idea de este artículo es dar las pautas iniciales pero sólidas para empezar a entender este tema. Las reglas de negocios cambian dependiendo de cada empresa en la que se trabaja, en esos casos se deben cambiar la lógica de los Procedimientos Almacenados y/o de las clases (casi nada en la página) pero agragando métodos y propiedades. Te recomendaría que le hagas un seguimiento detallado al código para que veas por donde esta yendo y lo puedas aplicar en tu caso.

Saludos...
Por Anónimo - Fecha: 2007/01/04 09:36 AM
Muy bueno el tutorial, de verdad me ayudó mucho ya que me estoy iniciando en esto de ASP.NET y el manejo de capas excepcional
Por Anónimo - Fecha: 2007/01/04 09:44 AM
muy bueno, estoy aprendiendo .net y creo q la frutilla del postre seria un diagramita de las capas para que se entienda aun mejor.
excelente trabajo
Por gloria - Fecha: 2007/01/19 07:30 PM
esta muy importante y se explican paso por paso para ensayar esta chevere
Por Anónimo - Fecha: 2007/01/29 03:48 AM
Un 10
Por Anónimo - Fecha: 2007/02/02 07:04 PM
que bueno este fue el primer ejemplo de una mini aplicacion .net con sus capas basicas, que hice!!, que buena explicacion yo con solo conocimientos basicos de programacion y eso enfocados a el desarrollo de aplicaciones en macromedia, que nada que ver con c# y asp entendi perfectamente el enterono basico con este tutorial de hecho me estaba costando trabajo entender como funcionaba la logica de programacion orientada a objetos en .net, lo que entendido basicamente en esta mini aplicacion, ojala encuentre nuevos ejemplos para poder digerirlos muy buena explicacion gracias.
Por Anónimo - Fecha: 2007/02/07 05:30 PM
MUY BUENO ESTA AYUDA, PUDE ENTENDER ALGUNAS COSITAS QUE ME TENIAN CONFUNDIDO...
MUCHAS GRACIAS...
Por Anónimo - Fecha: 2007/02/15 10:15 AM
EXCELENTE!! muy muy bueno. Muchas Gracias.
Por Anónimo - Fecha: 2007/03/04 06:59 PM
Exelente articulo. Requiere mucha dedicacion escribirlo con tanta claridad. Estoy tratando de rendir el examen de seguridad del DCE que es el unico que me falta para obtener la tersera estrella y este articulo me ha sido de gran utilidad.
Silvio.
Por Anónimo - Fecha: 2007/03/13 05:53 PM
Exelente artículo, me fué muy útil gracias desde argentina
Por Anónimo - Fecha: 2007/03/22 01:15 PM
gracias, eso es lo que se necesita, alguien que colabore
Por Anónimo - Fecha: 2007/04/02 10:30 PM
Hola

Muchas gracias por el código !! es de mucha utilidad.
Me gustaría saber como hacerle para que algunas páginas sean públicas, es decir, entrar sin necesidad de clave, y otras sí requieran acceso. Te agradecería mucho si me puedes ayudar :)

Saludos desde México !!

Lourdes
Por Anónimo - Fecha: 2007/04/10 12:25 AM
Hola Hanz Es un excelente articulo, lo que buscaba ,una pregunta como hacer que la aplicacion web muestre 4 imagenes de una base de datos.MM
Te lo agradeceria mucho
Por Anónimo - Fecha: 2007/05/10 06:46 AM
Pues al llegar al paso de crear procedimiento almacenado me dice que el objeto dbo.usp_VerificarUsuario no es valido.
Por Anónimo - Fecha: 2007/05/15 10:13 AM
¿Porque le atachea el MDF y el ?
y no hace la conexion de esta forma:
data source=localhost;initial catalog=DemoAcceso;User Id=sa ....
Por Anónimo - Fecha: 2007/05/24 09:14 AM
Muy bueno el articulo pero quisiera saber si es posible, como autentificar por tipos de usuarios sean administradores o usuarios "generales", el problema es que al agregar en el procedimiento almacenado el tipo de usuario no puedo luego blquear las paginas de administradores para los usuarios generales, si me funciona el login pero si copio la ruta de una pagina de administrator luego de haberme registrado como usuario general entra a la pagina y no me la bloquea.Si me puede alguien ayudar se lo agardeceria mucho.
Por Anónimo - Fecha: 2007/05/25 08:06 AM
me parce que el codigo bueno para algunas soluciones
Por Anónimo - Fecha: 2007/06/23 05:51 PM
Hola, sabes tu articulo me ha ayudado bastante para entender el funcionamiento e implementacion de los acceso web. Este articulo realiza el acceso de un tipo de usuario, como puedo hace para tener acceso para distintos roles.

gracias.
El-Lenny
Por Anónimo - Fecha: 2007/07/18 02:20 PM
Muy bueno. Cuando me logueo con cualquier usuario(valido o invalido) me da un error {"Could not find stored procedure ''usp_VerificarUsuario''."}. Tengo un server SQL dedicado y el VS2005 lo ve perectamente al igual que usp_VerificarUsuario como las tablas.
No logro dar con el error.
De todas maneras el aporte es excelente.
Por Anónimo - Fecha: 2007/07/26 03:51 PM
Hola, gracias por el aporte, empece a probarlo, quiero ayudar en esto: algunos dijeron q al querer guardar el procedimiento almacenado dice que el objeto dbo.usp_VerificarUsuario no es valido. No es valido pq dice ALTER, debe ser CREATE la primera vez, guardar y luego escribir ALTER, ya q con ALTER estas tratando de modificar un procedimiento q aun no existe.
Saludos,

Celia.-
Por Anónimo - Fecha: 2007/08/01 05:06 PM
Oye te este articulo me parece excelente tu explicación, me ayudaste un resto.
Oye como podría de esta misma forma validar si el usuario es ADMINISTRADOR que vea unas paginas y si es INVITADO que vea otras paginas. mi correo es hargir@hotmail.com o me lo explicas por aca

GRACIAS, atte HAROLD
Por Anónimo - Fecha: 2007/08/16 12:36 PM
muy bueno e interesante
Por Anónimo - Fecha: 2007/08/19 11:46 AM
Excelente, solo quisiera pedirte un favor, es posible con este metodo mostrar el nombre del usuario logeado en la pagina inicio? Saludos!

y felicidades excelente explicación!
Por Anónimo - Fecha: 2007/08/21 10:45 AM
excelente!!!, muy bien explicado.
Por Anónimo - Fecha: 2007/08/21 11:35 AM
para mostrar el usuario logueado yo te diria que almacenaras el usuario o el nombre en alguna variable de session y esta variable es la que muestras
Por royrojas - Fecha: 2007/08/21 04:29 PM
o tambien podrias usar el control LoginName que te despliega en un label el usuario activo
Por Anónimo - Fecha: 2007/09/05 11:13 AM
Hola que tal, pues muchas gracias por tu aporte de verdad esta genial, gracias....
Por Anónimo - Fecha: 2007/10/04 12:38 PM
Excelente, estoy iniciando en esto del C# y pues esta maravilloso para los que iniciamos!! mil gracias espero ver mas aportes tuyos asi :)
Por Anónimo - Fecha: 2007/12/09 10:55 AM
Excelente artículo, muy bien explicado
Por Anónimo - Fecha: 2007/12/28 10:43 AM
Muchas gracias por compartir su conocimiento. Esta bien explicado pasito a pasito.
Por Anónimo - Fecha: 2008/03/14 07:42 PM
OYE DISCULPA NECESITO QUE ME PUEDAS ECHAR LA MANO LO QUE PASA ES QUE CUANDO CARGO EL PROYECTO ME DICE UN ERROR DE LA SIGUIERNTE FORMA:
Object cannot be cast from DBNull to other types. bueno espero que puedas ayudarme de antemano gracias
Por Anónimo - Fecha: 2008/03/16 11:32 PM
Me encanta esta web y es costarricense verdad??
pura vida!
Por Anónimo - Fecha: 2008/03/17 12:29 AM
FELICIDADES AMIGO ESTA PAGINA ES EXCELENTE
Por Anónimo - Fecha: 2008/04/24 12:37 PM
muchas gracias, con lo poco que escribiste ya le agarre el hilo a .net :)
Por Anónimo - Fecha: 2008/05/10 03:34 PM
... todo muy bueno ,, faltari-a la opcion de logout .. salir
Por Anónimo - Fecha: 2008/05/14 10:49 PM
Oye ten la bondad de arreglar ese try/catch q sino no funciona eso...
Por Anónimo - Fecha: 2008/05/24 04:46 PM
Hey bacano el tutoriAL. CON ESTO SACAMOS 5
Por Anónimo - Fecha: 2008/06/01 11:46 AM
muchas gracias pana esta muy buena tu explicación......
Jose_Aragua
Por Anónimo - Fecha: 2008/06/24 03:36 PM
Hola!!!

La verdad me fue de gran ayuda este articulo, espero puedan publicarse otros articulos tan bueno como este. Gracias a todos los que participaron en tutorial, es demasiado bueno.
Saludos!!1
Por Anónimo - Fecha: 2008/09/17 12:14 PM
que tal, primero que nada felicidades por el articulo, es muy bueno.
tengo una duda, porque una ves que me registro y accedo a inicio.aspx y default.aspx, cuando le doy hacia atras hasta llegar nuevamente a la pagina de Login, si le doy un usuario y/o contraseña que no estan en la base de datos, porque aun asi me direcciona a inicio.aspx???

gracias.
Por Anónimo - Fecha: 2008/11/01 06:19 PM
HOLA, GRACIAS POR EL CODIGO, PERO RESULTA Q HICE TAL CUAL LO Q ESTA AQUI, Y CUANDO CORRO LA APLICACION E INTENTO LOGUEARME ME DICE QUE INTENTE DE NUEVO COMO SI MII CLAVE O USUARIO NO FUERAN VALIDOS, CUANDO EN REALIDAD SI LO SON, SI ALGUIEN SABE Q PUEDA ESTAR OCURRIENDO AGRADECERIA S COLABORACION Y AYUDA =D
Por royrojas - Fecha: 2010/01/25 08:26 AM
corriste la aplicacion paso a paso, pon un break point en donde te sale el errror y compara los datos del password para ver cual es la diferencia.
Por Anónimo - Fecha: 2010/01/28 10:21 PM
excelente
deberian de poner mas ejemplos sobre seguridad en sitios web
Por royrojas - Fecha: 2010/01/28 10:22 PM
saludos, gracias por comentar.
pronto tendremos mas recursos sobre seguridad
Por Anónimo - Fecha: 2011/03/08 01:29 PM
muy bueno aporte, lo probare
Por Anónimo - Fecha: 2011/03/31 10:10 AM
Que tal excelente aporte pero tengo una duda, necesito implementar exactamente esto la unica diferencia es que la base esta en un servidor con windows server y mi duda es si tiene que cambiar algo, ademas del conection string y de los campos ke autentifican tambien me gustaria ke me recomendaras al
Por Anónimo - Fecha: 2011/03/31 10:13 AM
algun libro,manual o tutoria de asp.net soi novato y solo e trabajado con java lo cual es ventaja por su similitud con c#
Por Anónimo - Fecha: 2011/12/28 03:44 AM
This is a rlaely intelligent way to answer the question.
Por Anónimo - Fecha: 2011/12/29 06:08 AM
LN0eXJ , [url=http://qdxugsovhgpj.com/]qdxugsovhgpj[/url], [link=http://gbdfertngjpw.com/]gbdfertngjpw[/link], http://gdcurwscbybh.com/
Por Anónimo - Fecha: 2011/12/31 08:06 AM
9ozcFy , [url=http://sqwhfjrrebqy.com/]sqwhfjrrebqy[/url], [link=http://tzwqghjxduef.com/]tzwqghjxduef[/link], http://ozfdxvctlpli.com/
Por Anónimo - Fecha: 2012/06/03 05:25 PM
Hello! eadkcaf interesting eadkcaf site! I'm really like it! Very, very eadkcaf good!
Por Anónimo - Fecha: 2012/06/03 05:26 PM
Very nice site! [url=http://opeaixy1.com/qsqvaa/2.html]cheap cialis[/url]
Por Anónimo - Fecha: 2012/06/03 05:26 PM
Very nice site! cheap cialis http://opeaixy1.com/qsqvaa/4.html
Por Anónimo - Fecha: 2012/06/03 05:26 PM
Very nice site!
Por Anónimo - Fecha: 2012/06/03 05:26 PM
Hello! cfdebca interesting cfdebca site! I'm really like it! Very, very cfdebca good!
Por Anónimo - Fecha: 2012/06/03 05:26 PM
Very nice site! [url=http://opeaixy1.com/qsqvaa/2.html]cheap cialis[/url]
Por Anónimo - Fecha: 2012/06/03 05:26 PM
Very nice site! cheap cialis http://opeaixy1.com/qsqvaa/4.html
Por Anónimo - Fecha: 2012/06/03 05:26 PM
Very nice site!
Por Anónimo - Fecha: 2012/06/17 01:10 PM
Hello! aaebdef interesting aaebdef site! I'm really like it! Very, very aaebdef good!
Por Anónimo - Fecha: 2012/06/17 01:11 PM
Very nice site! [url=http://apxoiey1.com/qoaayt/2.html]cheap cialis[/url]
Por Anónimo - Fecha: 2012/06/17 01:11 PM
Very nice site! cheap cialis http://apxoiey1.com/qoaayt/4.html
Por Anónimo - Fecha: 2012/06/17 01:11 PM
Very nice site!
Por Anónimo - Fecha: 2012/06/17 01:12 PM
Hello! bggbkec interesting bggbkec site! I'm really like it! Very, very bggbkec good!
Por Anónimo - Fecha: 2012/06/17 01:12 PM
Very nice site! [url=http://apxoiey1.com/qoaayt/2.html]cheap cialis[/url]
Por Anónimo - Fecha: 2012/06/17 01:14 PM
Very nice site! cheap cialis http://apxoiey1.com/qoaayt/4.html
Por Anónimo - Fecha: 2012/06/17 01:16 PM
Very nice site!
Por Anónimo - Fecha: 2015/12/17 03:55 PM
Third Flower My spouse and i have aadelry been now delighted that Albert could carry out his reports on account of the concepts he had through your online page. It really is now and again perplexing to only constantly be freely giving techniques which some people c
Por Anónimo - Fecha: 2015/12/19 02:50 AM
Instead of converting neleinws (n) to tags, use the tag (stands for preformatted). It will display the text within the tag as is. Here's a sample code:This is my pre-formatted textTable 1 | Table 2 | Table 31515 | 2922 | 9222Self http://rjfksvhz.com [url=http://xovrazhu.com]xovrazhu[/url] [link=http://trcmwumytt.com]trcmwumytt[/link]
Por Anónimo - Fecha: 2015/12/20 02:23 PM
As long as the app isn't being replicated and dirtuibsted, they wouldn't. A single-user production workstation is indistinguishable from a development workstation. It's only when apps are being dirtuibsted for multi-user apps that it would be noticeable. http://pzvvkfhyo.com [url=http://invqeivn.com]invqeivn[/url] [link=http://sxnevnzho.com]sxnevnzho[/link]
Por Anónimo - Fecha: 2017/05/31 10:14 AM
me marca un error en el Dal_Acceso x = new Dal_Acceso();
Ingrese su Comentario
Comentario
Para poder votar debe estar registrado en DotNetcr.com
Solo queda registrado el primer voto enviado
Voto


Últimos Recursos
ricardo leppe t
pedrojavier
CALIN
willipinru
richard
ragomez
PER 238
MEX 236
CRI 188
COL 118
ESP 105
ARG 88