Foros del Web » Programando para Internet » ASPX (.net) »

Redirigir a página de login (pero dependiendo de la página solicitada)

Estas en el tema de Redirigir a página de login (pero dependiendo de la página solicitada) en el foro de ASPX (.net) en Foros del Web. Saludos! Tengo una aplicación con autenticación mediante formularios. Si se intenta acceder directamente a una página y no estás autenticado te redirecciona directamente a la ...
  #1 (permalink)  
Antiguo 22/09/2006, 13:40
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Redirigir a página de login (pero dependiendo de la página solicitada)

Saludos!
Tengo una aplicación con autenticación mediante formularios. Si se intenta acceder directamente a una página y no estás autenticado te redirecciona directamente a la página de login poniendo en web.config:
Código:
<authentication mode="Forms">
 <forms name=".ASPXLOGIN" loginUrl="login.aspx" protection="All" timeout="20" />
</authentication>
Hasta ahí lo tengo claro, pero lo que necesito es que si se ha pedido una página que esté, por ejemplo, en "./directorio_1/" y el usuario no está autenticado, me redirija a "login_1.aspx"; pero si se ha pedido una página de "./directorio_2/" que me redirija a "login_2.aspx".

Es posible hacer esto de alguna forma cambiando algo del web.config o sólo podría hacerlo "a mano"??


Muchas gracias y un saludo.
  #2 (permalink)  
Antiguo 27/09/2006, 03:39
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Ninguna idea?
Sólo es posible hacerlo por código?

Saludos
  #3 (permalink)  
Antiguo 27/09/2006, 15:21
 
Fecha de Ingreso: agosto-2006
Mensajes: 101
Antigüedad: 17 años, 8 meses
Puntos: 0
Si se puede compañero

Echale un ojo a esto:

Código:
 
<system.web>
<customErrors mode="Off"/>
<authentication mode="Forms">
<forms name=".ASPXFORMSDEMO" loginUrl="login.aspx" protection="All" path="/" timeout="30"/>
<passport redirectUrl="internal"/>
</authentication>
<compilation debug="true"/>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
<location path="admin">
<system.web>
<authorization>
<deny users="?"/>
<deny roles="Usuario"/>
<allow roles="Admin"/>
</authorization>
</system.web>
</location>
<location path="privado">
<system.web>
<authorization>
<deny users="?"/>
<allow roles="Usuario"/>
</authorization>
</system.web>
</location>
Jo que mal tabulado... en fin.

Procedamos.

Fijate que se crean dos roles, Usuario y Admin. Cada uno de ellos tendrá permisos en el directorio privado y en el directorio admin respectivamente.

Con eso la parte del webconfig ya la tienes.

Ahora lo que tienes es que currarte la autentificacion, que yo la suelo hacer mediante una cookie.

Te pasteo algo de código que te puede ayudar a la hora de trabajar con los roles. Básicamente lo que hay que hacer es que cuando un usuario se intenta autentificar, hay que asignarle por código (c# o vb.net) qué rol le pertenece. Posteriormente el sistema se ocupará, según lo definido en webconfig de permitirle "quedarse en el directorio" o redireccionarle a la página que pones más arriba.

Vamos a por el código:

El comportamiento del tipico botón Entrar de un sitio web podría ser el siguiente:
Código:
 
if (el usuario se ha autentificado correctamente en la web)
{
FormsAuthenticationTicket tkt;
String cook, sNombre;
HttpCookie ck;
sNombre = usuario;
tkt = new FormsAuthenticationTicket(1, sNombre, DateTime.Now, DateTime.Now.AddMinutes(30), false, i + "");
cook = FormsAuthentication.Encrypt(tkt);
ck = new HttpCookie(FormsAuthentication.FormsCookieName, cook);
Page.Response.Cookies.Add(ck);
}
En éste código básicamente se ha creado la cookie y en el momento de añadirla, se dispara el evento de autentificación que te comento más abajo.

Como nota aclaratoria, la variable i almacena un 1 ó un 2 si el usuario (segun nos haya dicho la base de datos al confrontarlo con la user/pass) administrador o usuario normal respectivamente.(Más abajo comprenderás por qué te cuento esto).


Ahora tienes que añadir a tu sitio web un componente del tipo Global.asax
y dentro de él programar el siguiente evento: Application_AuthenticateRequest con un código similar a éste:

Código:
 
if (!(HttpContext.Current.User == null))
{
if (HttpContext.Current.User.Identity.AuthenticationType == "Forms")
{
FormsAuthenticationTicket tkt;
tkt = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
String[] usuarios ={ "" };
if (Convert.ToInt32(tkt.UserData) == 1)
{
//usuario administrador
usuarios[0] = "Admin";
}
else
{
if (Convert.ToInt32(tkt.UserData) == 2)
{
//usuario normal
usuarios[0] = "Usuario";
}
else
{
//usuario mal autenticado
Response.Redirect("http://www.tuweb.com/login.aspx");
}
}
System.Web.Security.FormsIdentity id;
id = (System.Web.Security.FormsIdentity)HttpContext.Current.User.Identity;
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, usuarios);
}
}

Este evento es el que se dispara cuando un usuario pretende autentificarse. Entonces es en este punto donde se le asigna (en función de su user/password) qué rol tiene el usuario.

Bueno espero que se entienda bien y sobre todo lo siento por las tabulaciones.

Un saludo compañero.

__________________
Artículos sobre programación - www.webprogramacion.com

Última edición por dvelazquez; 27/09/2006 a las 15:25 Razón: Para resaltar algunas palabras con colores ...
  #4 (permalink)  
Antiguo 28/09/2006, 05:13
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Magnífico dvelazquez
Es justo lo que necesitaba y además es un gran tutorial para las autenticaciones.

Muchas gracias
  #5 (permalink)  
Antiguo 28/09/2006, 13:12
 
Fecha de Ingreso: agosto-2006
Mensajes: 101
Antigüedad: 17 años, 8 meses
Puntos: 0
Compañero, he escrito un artículo mejor redactado y tal de lo que te he contado en mi web.

Echale si quieres ahi un ojo y aprovecho para invitarte a que te suscribas a las novedades de la web, si quieres recibir por correo electrónico, de manera periódica, los nuevos articulos que vayamos escribiendo.

http://www.webprogramacion.com/registro.aspx?id=77

Un saludo.

Última edición por dvelazquez; 08/08/2007 a las 02:26
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:29.