En este artículo te explico cómo poder tener directorios privados y públicos en un mismo sitio Web que está gestionado con cualquier versión de ASP.NET (también válido para páginas .aspx). Además de poder tener distintos tipos de acceso (privado o público) dentro de un mismo directorio.
Introducción
En este artículo te explico cómo poder tener directorios privados y públicos en un mismo sitio Web que está gestionado con ASP.NET (cualquier versión).
Para poder lograrlo tenemos que modificar el fichero web.config de nuestro sitio Web.
Tenemos dos posibilidades de configurar ciertas partes como públicas o privadas:
- Tener un sitio en el que haya que autenticarse y poder tener páginas o directorios públicos, es decir que no haya que autenticarse para poder verlos.
- Tener un sitio público, es decir, que no haya que autenticarse, pero en el que queremos tener ciertos directorios o páginas para las que se requiera autenticación.
Todo consiste en tener en el web.config una sección llamada <location que debe estar dentro de <configuration> pero no dentro del <system.web> principal (esto es muy importante), sino que deben ser nodos independientes, además de que podemos tener todos los que necesitemos, cada uno de ellos para indicar directorios o páginas diferentes.
Además debemos tener la parte correspondiente al requerimiento o no de que haya que autenticarse en el sitio.
Pero independientemente de que haya o no que autenticarse, el fichero de "Login" debe ser único y hay que indicarlo en la sección "habitual" del fichero web.config.Como hemos comentado que hay dos formas de configurar esto de los directorios y páginas privadas/públicas, veremos dos ejemplos de un fichero web.config que tengan estas dos posibilidades, además de que podrás comprobar que todo esto funciona sin tener que salir de mi sitio (o casi), ya que una de las pruebas te llevará al sitio de los foros, en el que he creado un directorio público para el que no tienes porqué autenticarte.
Como sabes, y si estás leyendo esto es que ya lo has comprobado, en mi sitio no es necesario autenticarse, pero he creado un directorio en el que te pedirá que te autentifiques, y si no lo haces, no podrás ver la página de prueba que contiene, ahora en un momento te pongo los links para las dos posibles pruebas.
Antes veamos que debemos poner en esos ficheros de configuración.
Indicar en el web.config que NO tenemos que autenticarnos para entrar en un sitio, pero queremos tener directorios o páginas que necesiten autenticación
El primer ejemplo será el de indicar que no hay que autenticarse para entrar en un sitio, pero crearemos un directorio para el que si que habrá que escribir el usuario y la clave.
En este caso, en la sección <authorization> tenemos que poner que permitimos a todos los usuarios:
<allow users="*" />
Pero como resulta que vamos a autenticar a los usuarios, también debemos crear las entradas correspondientes en la sección <authentication, de forma que la tengamos así:
<authentication mode="Forms">
<forms loginUrl="Login.aspx">
Nota:
Si solo vamos a requerir autenticación en un directorio determinado, podemos indicar que la página de login está en ese directorio, por ejemplo:
<forms loginUrl="misColegas/Login.aspx">
En esa misma sección podemos indicar los nombres de los usuarios y passwords, o bien podemos tenerlos guardados en una base de datos o donde creamos conveniente, en este caso da igual porque no te voy a mostrar el código para saber si el usuario está o no registrado, si quieres saber cómo autenticar usuarios sigue este link.
Y en ese mismo link puedes ver cómo indicar los usuarios y passwords usando claves SHA1 para que no sean contraseñas fácilmente reconocibles, sino encriptadas.Para indicar un directorio que sea privado o para el que haya que estar autenticado, usaremos: <deny users="?" /> dentro de una sección <authorization> pero que será interna al "location" del directorio que queremos mantener solo para los usuarios registrados.
Por ejemplo, si queremos que el directorio "misColegas" sea privado y solo puedan entrar usuarios registrados, tendrás que hacer algo como esto:<location path="misColegas"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location>Como ves, en esta sección <location> no hay que indicar ni que usuarios se permiten ni donde está la página de login, ya que esos datos se indican en el <system.web> principal, por tanto siempre se usará la misma página de login y los mismos usuarios, independientemente de que página o directorio queramos proteger.
De la misma forma que definimos un directorio podemos definir una página en particular. Solo es cuestión de indicarla en el atributo "path" de location.
Y como ya te mencioné antes, podemos tener tantos bloques <location> como necesitemos, con directorios y/o páginas.
El fichero web.config completo sería como el siguiente:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <authentication mode="Forms"> <forms loginUrl="Login.aspx"> <credentials passwordFormat="SHA1"> <user name="guille" password="251DBBC3BFFC9445DCE9787E4AA4EA9BD691E705"/> <user name="pepe" password="7550D35A69BE9ACA9AF9C29B880DC3ADEA01BEDC"/> <user name="pili" password="8A42398D66BBD841D44122167025661DEA5EDE28"/> <user name="rafa" password="3E05C90F8530B1BA72519824415D05E08CF5718B"/> </credentials> </forms> </authentication> <authorization> <!-- autorizar a todos los usuarios más abajo se indican los directorios (o páginas) a las que solo puedan acceder usuarios registrados --> <allow users="*" /> </authorization> </system.web> <!-- ********************************************* Indicar las páginas o directorios no públicos Podemos tener tantas secciones <location> como queramos ********************************************* --> <!-- Para marcar un directorio solo para usuarios registrados --> <location path="misColegas"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location> <!-- Esta página, solo para usuarios registrados --> <location path="CrearClave.aspx"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location> </configuration>
Indicar en el web.config que tenemos que autenticarnos para entrar en un sitio y tener páginas o directorios que no necesitan autenticación
El segundo caso es del de indicar que hay que autenticarse para entrar en un sitio, y queremos tener directorios y/o páginas que sean de libre acceso.
En este caso, en la sección <authorization> tenemos que poner que solo permitimos a los usuarios autenticados:
<deny users="?" />
En este caso, como queremos que todos los usuarios deban autenticarse (salvo en los sitios públicos), también tenemos que tener la sección correspondiente en el fichero web.config en el que se indique que página se usará para el login y que tipo de autenticación queremos usar, En nuestro ejemplo, será usando un formulario ASPX llamado Login.aspx:
<authentication mode="Forms">
<forms loginUrl="Login.aspx">
Como te indiqué antes, en esa misma sección podemos indicar los nombres de los usuarios y passwords, o bien podemos tenerlos guardados en una base de datos o donde creamos conveniente, en este caso da igual porque no te voy a mostrar el código para saber si el usuario está o no registrado, si quieres saber cómo autenticar usuarios sigue este link.
Y en ese mismo link puedes ver cómo indicar los usuarios y passwords usando claves SHA1 para que no sean contraseñas fácilmente reconocibles, sino encriptadas.
Para indicar un directorio que sea público para el que no haya que estar autenticado, usaremos: <allow users="*" /> dentro de una sección <authorization> pero que será interna al "location" del directorio que queremos mantener solo para los usuarios registrados.
Por ejemplo, si queremos que el directorio "publico" sea público y puedan entrar todos los usuarios, estén o no registrados, tendrás que hacer algo como esto:<location path="publico"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>Al igual que antes, en esta sección <location> no hay que indicar ni que usuarios se permiten ni donde está la página de login, ya que esos datos se indican en el <system.web> principal, por tanto siempre se usará la misma página de login y los mismos usuarios, independientemente de que página o directorio queramos proteger.
De la misma forma que definimos un directorio podemos definir una página en particular. Solo es cuestión de indicarla en el atributo "path" de location.
Y como ya te mencioné antes, podemos tener tantos bloques <location> como necesitemos, con directorios y/o páginas.
El fichero web.config completo sería como el siguiente:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <authentication mode="Forms"> <forms loginUrl="Login.aspx"> <credentials passwordFormat="SHA1"> <user name="guille" password="251DBBC3BFFC9445DCE9787E4AA4EA9BD691E705"/> <user name="pepe" password="7550D35A69BE9ACA9AF9C29B880DC3ADEA01BEDC"/> <user name="pili" password="8A42398D66BBD841D44122167025661DEA5EDE28"/> <user name="rafa" password="3E05C90F8530B1BA72519824415D05E08CF5718B"/> </credentials> </forms> </authentication> <authorization> <!-- autorizar a los usuarios autenticados. Más abajo se indican los directorios (o páginas) a las que pueden acceder todos los usuarios. --> <deny users="?" /> </authorization> </system.web> <!-- ****************************************** Indicar las páginas o directorios públicos Podemos tener tantas secciones <location> como queramos ****************************************** --> <!-- Para marcar un directorio solo para usuarios registrados --> <location path="prueba"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> <!-- Esta página, es accesible a todos los usuarios --> <location path="privado/PaginaPublica.aspx"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> </configuration>
Nota:
Podemos tener páginas públicas dentro de directorios que necesitan autenticación y viceversa.
Para poder probar todo esto, puedes usar estos links:
- Prueba de un directorio privado dentro de una Web pública que no necesita autenticación (en este mismo sitio)
- Prueba de un directorio público en una Web que necesita estar autenticado para usarla (en mis foros)
Para la primera prueba puedes usar cualquiera de estas combinaciones de usuarios y passwords:
Usuario: rafa, password: Rafael
Usuario: pili, password: Pilar
MUY IMPORTANTE:
Todo esto de la autenticación solamente funciona con páginas .aspx, no en las que tengan otra extensión como .htm, .html, .asp, ya que es cosa del ASP.NET y el ASP.NET solo "entiende" sus propias extensiones.
Espero que te sea de utilidad todo esto.
Nos vemos.
Guillermo