2009-06-26 18 views
7

Tengo un sitio web ASP.Net con múltiples roles, cada uno con acceso a un directorio separado (es decir, los usuarios administradores pueden acceder/admin, los compradores pueden acceder/comprar, etc.), utilizando una página de inicio de sesión compartida. Si alguien visita la página de inicio de sesión con la URL de retorno establecida en un directorio al que no tiene acceso (por ejemplo, un comprador visita /login.aspx?returnurl=/admin/index.aspx), el usuario puede autenticarse correctamente (las credenciales de inicio de sesión son válido), pero terminan en la página de inicio de sesión (no tienen acceso a la página que han solicitado).¿Determina si el usuario puede acceder a la página solicitada?

¿Cómo recojo esto para que pueda mostrar un mensaje al usuario?

Respuesta

2

que terminé haciendo esto en el evento Page_Load de la página de inicio de sesión:

if (User.Identity.IsAuthenticated) 
{ 
    LoginErrorDetails.Text = "You are not authorized to view the requested page"; 
} 

El ser pensante, si un usuario autenticado termina en la página de inicio de sesión, que o bien han sido enviados a su como resultado de tratando de acceder a una página que no están autorizados a ver, o se han autenticado y luego se han ido manualmente a la página de inicio de sesión (poco probable).

Otra acción sería enviar al usuario a la página de inicio correspondiente cada vez que visite la página de inicio de sesión, si ya están autenticados.

+0

Esto es solo una solución parcial, más adecuada si no tiene diferentes roles que pueden acceder a diferentes páginas. Si lo haces, puedes tener un usuario que esté autenticado pero que aún no pueda acceder a ReturnUrl, lo que posiblemente te lleve a un bucle de redirección. –

+0

La respuesta de Andrey debe marcarse como la respuesta correcta. – EtienneT

+0

Autenticación y autorización son conceptos totalmente diferentes ... –

0

se le puede redirigir a la página de índice, diciéndole que él no puede acceder a esa página;)

+0

¿Cómo sé que no puede acceder a esa página? Puedo determinar en qué función se encuentra, pero no qué función puede acceder a la página solicitada. – user9659

+0

Bueno, deberías hacer algo como niveles. Si tienes el nivel 4 superior, puedes acceder a la página. O con los roles, debe atribuir a cada página un rol específico que pueda acceder a esa página. – Timotei

1

Si tiene diferentes directorios y utiliza la autenticación asp.net es muy fácil. Todo lo que necesita es poner el archivo web.config en cada directorio y definir las funciones que pueden acceder a los archivos en ese directorio como esto:

<authorization> 
    <allow roles="shoppers"/> 
    <deny users="?"/> 
</authorization> 

Usted puede obtener más detalles de this artículo en MSDN

Puede establecer todo en web.config principal de la siguiente manera:

<!-- Configuration for the "sub1" subdirectory. --> 
     <location path="sub1"> 
     <system.web> 
      <httpHandlers> 
      <add verb="*" path="sub1" type="Type1"/> 
      <add verb="*" path="sub1" type="Type2"/> 
      </httpHandlers> 
     </system.web> 
     </location> 

     <!-- Configuration for the "sub1/sub2" subdirectory. --> 
     <location path="sub1/sub2"> 
     <system.web> 
      <httpHandlers> 
      <add verb="*" path="sub1/sub2" type="Type3"/> 
      <add verb="*" path="sub1/sub2" type="Type4"/> 
      </httpHandlers> 
     </system.web> 
     </location> 
    </configuration> 

esto es de this artículo en MSDN :)

EDIT:

En el método de carga de la página hacer esto:

if(!User.IsInRole("shopper")) 
{ 
    lblNoAccess.Visible=true; 
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS"; 
} 

Espero que esto ayude!

+0

El sitio web ya está configurado de manera similar a lo que ha publicado; sin embargo, lo que ha publicado en realidad no parece responder a mi pregunta de ninguna manera. – user9659

+0

Bien, ahora te tengo, el uso está autenticado pero no autorizado para ver esta página. He editado mi respuesta – TheVillageIdiot

+0

El método page_load en la página especificada por returnurl no se activa, ya que el usuario no está llegando tan lejos ya que no está autorizado. El concepto es exactamente lo que quiero hacer sin embargo. – user9659

1

Un enfoque sería anular OnLoad de sus formularios aspx y comprobar si el usuario autenticado tiene permitido el acceso al recurso en función de la función. Así se crea un BasePage.cs (en el que se define una BasePage clase que hereda de System.Web.UI.Page), por ejemplo, de la cual todas sus formas (aspx) heredan, en el que se hace esto:

protected override void OnLoad(EventArgs e) 
{ 
    InitializeSitemap(); 
    if (SiteMap.CurrentNode != null) 
    { 
     if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode))) 
     { 
      // You can redirect here to some form that has a custom message 
      Response.Redirect("~/Forms/Logout.aspx"); 

      return; 
     } 
    } 
    base.OnLoad(e); 
} 
Entonces

en su clase UrlHelper necesita que la función IsAccessible utilizado anteriormente:

public static bool IsAccesible(SiteMapNode node) 
{ 
    bool toRole = false; 

    foreach (string role in node.Roles) 
    { 
     if (role == "*" || HttpContext.Current.User.IsInRole(role)) 
     { 
      toRole = true; 
     } 
    } 

    return toRole; 
} 

Aquí se IsAnonymousAllowed en caso de que se preguntaban:

public static bool IsAnonymousAllowed(SiteMapNode node) 
{ 
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false; 
} 
0

Bueno, ¿por qué no se captura el directorio de inicio de sesión en el pa ge? Si la página de inicio de sesión puede determinar a qué directorio está intentando acceder el usuario, es posible que se le redireccione a la página correcta en función del rol. Si alguien intenta ir a/admin, y la autenticación tiene éxito, puede verificar si tiene acceso allí. De lo contrario, puede redireccionar a la página de destino básica para indicar que no tiene acceso o redirigirla a la página de destino de la función.

EDITAR: Probablemente podría hacer el redireccionamiento en el evento LoggedIn del control.

0

Otra opción es establecer una variable de sesión cuando está verificando derechos, y mostrar eso en la página de inicio de sesión.

por lo que podría hacer:

if(!User.IsInRole("shopper")) 
{ 
    session("denied") = "You don't have access to shop"; 
    response.redirect("/login"); 
} 

Luego, en la página de inicio de sesión:

if (session("denied") != "") { 
    message.text = session("denied"); 
    session("denied") = ""; 
} 
Cuestiones relacionadas