Siempre ha sido muy importante el hecho de autenticar usuarios en nuestras aplicaciones. El hecho de poder establecer roles de usuarios, de poder controlar los permisos de los usuarios es muy necesario en la mayoría de sistemas que desarrollamos. En este articulo vamos a observar lo fácil que es configurar la autenticación de usuarios que visiten nuestro sitio mediante la Pertenencia de ASP.NET, el cual requerirá poco o nada de código para una completa administración gracias a los controles de ASP.NET.
Primero debemos configurar nuestra Base de Datos SQL, para esto ya existe un Wizard que viene incluido en nuestra versión de .NET Framework.
Si nuestra aplicación es .NET Framework 2 o 3.5, nos dirigimos a la siguiente ruta
C:\Windows\Microsoft.NET\Framework\version2
Si nuestra aplicación es .NET Framework 4 o 4.5, nos dirigimos a la siguiente ruta
C:\Windows\Microsoft.NET\Framework\version4
Cuando ya estemos ubicados en la ruta respectiva, buscamos el siguiente archivo: aspnet_regsql.exe
Lo ejecutamos y nos abrirá una ventana de Dialogo como la siguiente.
Observaremos una descripción del Asistente, damos Click en Siguiente. En esta parte podemos visualizar que tenemos como opciones instalar la configuración de pertenencia en nuestra Base de Datos(o en una nueva) y Eliminar la configuración que ya tengamos en nuestra Base de Datos.
Click en Siguiente. Finalizamos la configuración proporcionando nuestros datos de autenticación de nuestra Base de Datos.
Ahora abrimos nuestra aplicación en Visual Studio. Por defecto al crear una aplicación o Sitio Web se crea un archivo de configuración Web.config, de lo contrario procedemos a crearlo.
Por defecto, en la Versión .NET Framework 4.5 se verá de la siguiente manera.
- <?xml version="1.0"?>
-
- <configuration>
-
- <system.web>
- <compilation debug="false" targetFramework="4.5" />
- <httpRuntime targetFramework="4.5" />
- </system.web>
-
- </configuration>
En este ejemplo realizaremos una configuración básica, debido a que esta puede variar dependiendo de las necesidades del desarrollo. Inicialmente configuramos la cadena de conexión con nuestra Base de Datos SQL (El nombre de nuestra cadena de conexión “name” puede ser cualquiera, pero es necesario tenerlo presente para más adelante)
- <?xml version="1.0"?>
- <!--
- For more information on how to configure your ASP.NET application, please visit
- http://go.microsoft.com/fwlink/?LinkId=169433
- -->
- <configuration>
- <connectionStrings>
- <add name="AspNetSqlServer"
- connectionString="cadenadeconexion"
- providerName="System.Data.SqlClient" />
- </connectionStrings>
- <system.web>
- <compilation debug="true" targetFramework="4.5"/>
- <httpRuntime targetFramework="4.5"/>
- </system.web>
- </configuration>
Donde la cadenadeconexion podemos obtenerla de la siguiente manera
Podemos observar nuestra cadena de conexión de nuestra Base de Datos, solo tendríamos que copiarla a nuestro archivo de configuración y proporcionar la clave.
Ya configurada nuestra cadena de conexión procederemos a configurar nuestro tipo de autenticación, la cual se basará en formularios (De esta manera podemos controlar el acceso a las paginas) y definimos la página de login por si el usuario esta intentando acceder y no se ha autenticado.
- <?xml version="1.0"?>
-
- <configuration>
- <connectionStrings>
- <add name="AspNetSqlServer"
- connectionString="Data Source=DirecciondelServidor;Initial Catalog=NombreBasedeDatos;User ID=NombreUsuario;Password=Clave"
- providerName="System.Data.SqlClient" />
- </connectionStrings>
- <system.web>
- <compilation debug="false" targetFramework="4.5" />
- <httpRuntime targetFramework="4.5" />
- <authentication mode="Forms">
- <forms loginUrl="login.aspx" name="Login"/>
- </authentication>
- </system.web>
-
- </configuration>
Un detalle importante es saber que podemos tener archivos de configuración Web.config por carpeta que haya en nuestra aplicación y la configuración que se realice se tomará para las páginas de ese directorio y para las páginas de las carpetas descendientes.
Aprovechando esta lógica podemos hacer uso eficaz de la etiqueta authorization (ubicada dentro de la etiqueta system.web de nuestro Web.config) que nos permite configurar los accesos de los usuarios.
- <authorization>
- <allow users="*"/><!-- Permitimos acceso a todos los Usuarios -->
- <allow roles="Admin,SuperAdmin"/><!-- Permitimos acceso a todos los Usuarios de rol Admin o SuperAdmin -->
- <deny users="?"/><!-- Denegamos acceso a todos los Usuarios Anonimos -->
- </authorization>
Este es solo un ejemplo, lo importante es que siempre permitamos acceso y luego denegamos.
Si quisiéramos referirnos solo a una página, un ejemplo sería de la siguiente manera
- <configuration>
- <location path="Login.aspx">
- <system.web>
- <authorization>
- <allow users="?"/>
- </authorization>
- </system.web>
- </location>
- </configuration>
Continuando con nuestro ejemplo configuramos nuestro proveedor de Usuarios (membership) y nuestro proveedor de roles de Usuario (roleManager), por lo tanto nuestro archivo Web.config se vería de la siguiente manera
- <?xml version="1.0"?>
-
- <configuration>
- <connectionStrings>
- <add name="AspNetSqlServer"
- connectionString="Data Source=DirecciondelServidor;Initial Catalog=NombreBasedeDatos;User ID=NombreUsuario;Password=Clave"
- providerName="System.Data.SqlClient" />
- </connectionStrings>
- <system.web>
- <compilation debug="false" targetFramework="4.5" />
- <httpRuntime targetFramework="4.5" />
- <authentication mode="Forms">
- <forms loginUrl="login.aspx" name="Login"/>
- </authentication>
- <membership defaultProvider="AspNetSqlMembershipProvider">
- <providers>
- <clear/>
- <add name="AspNetSqlMembershipProvider"
- type="System.Web.Security.SqlMembershipProvider"
- connectionStringName="AspNetSqlServer"
- applicationName="/"
- minRequiredNonalphanumericCharacters="0"
- maxInvalidPasswordAttempts="5"
- enablePasswordRetrieval="false"
- enablePasswordReset="true"
- requiresQuestionAndAnswer="false"
- requiresUniqueEmail="true"/>
- </providers>
- </membership>
- <roleManager defaultProvider="SqlProvider" enabled="true">
- <providers>
- <clear/>
- <add name="SqlProvider"
- type="System.Web.Security.SqlRoleProvider"
- connectionStringName="AspNetSqlServer"
- applicationName="/"/>
- </providers>
- </roleManager>
- <machineKey validationKey="CE72B8A4671D90F164C189E1379DFB4353DD5BB8CD2CFF0"
- decryptionKey="F83A6FC2271002158D0ED7F7DC32A0043391C125C2B86139689A99D6F217EE2C"
- validation="SHA1"
- decryption="AES" />
- </system.web>
- </configuration>
Para terminar la configuración de nuestro Web.config es recomendable cambiar el machineKey entrando a la página http://aspnetresources.com/tools/machineKey y damos Click en Generate Key
El machineKey es necesario por ejemplo si estamos encriptando la clave de los Usuarios.
Algunas formas de encriptación son por ejemplo:
Es obvio que podemos cambiar la configuración del proveedor de Usuarios (membership) y del proveedor de roles de Usuario (roleManager) por el que requiera nuestro desarrollo, es importante observar que para los dos, el connectionStringName será el nombre de nuestra cadena de conexión definido anteriormente.
Para validar nuestra configuración procederemos a crear un usuario desde la herramienta de Administración de Sitios Web
Nos dirigimos a la sección de Seguridad. En esta podemos crear usuarios manualmente y crear Roles de usuario, solo en este caso crearemos un usuario por este medio para validar nuestra configuración, debido a que los usuarios normalmente se registrarán en una página de nuestra aplicación e iniciarán sesión, haciendo uso de los controles de ASP.NET.
Click en crear usuario, llenamos los datos y guardamos.
Si todo ha salido bien, el mensaje que se mostrará será el siguiente
Por lo tanto finalizamos con éxito nuestra configuración básica de autenticación de Usuarios en ASP.NET. Mediante los controles de ASP.NET un usuario se podrá loguear o registrar automáticamente (solo cambiaríamos el diseño ya que hasta el momento no es necesario escribir código) y después de haber iniciado sesión podríamos obtener los datos del usuario de la siguiente manera
- var membershipUser = System.Web.Security.Membership.GetUser();
- Guid userId = (Guid)membershipUser.ProviderUserKey;//Obtener id del Usuario
- string password = membershipUser.GetPassword();//Obtener clave del Usuario
Lo recomendable es crear una Tabla donde tendremos los datos adicionales que necesitemos de los usuarios y que llenarán en el registro. Esta Tabla se relacionaría con la creada automáticamente por nuestro sistema de autenticación de Usuarios de ASP.NET aspnet_Users y por lo tanto el Id de nuestros Usuarios sería de tipo GUID que en SQL se conoce como uniqueidentifier.