Pregunta

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.), usando 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).

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

¿Fue útil?

Solución 2

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";
}

Pensando que, si un usuario autenticado termina en la página de inicio de sesión, se les ha enviado como resultado de intentar acceder a una página que no están autorizados a ver, o se autenticaron y luego fueron manualmente a página de inicio de sesión (poco probable).

Una acción adicional sería enviar al usuario a la página de inicio relevante cada vez que visite la página de inicio de sesión, si ya está autenticado.

Otros consejos

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

es lo que necesita usar para probar el acceso del usuario a una ubicación (página o carpeta) ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

Un enfoque sería anular OnLoad de sus formularios aspx y verificar si el usuario autenticado tiene acceso al recurso en función del rol. Entonces, crea un BasePage.cs (en el que define una clase BasePage que hereda de System.Web.UI.Page), por ejemplo, del que heredan todos sus Formularios (aspx), en el que 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);
}

Luego, en su clase UrlHelper, necesita la función IsAccessible utilizada 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í está IsAnonymousAllowed en caso de que se lo haya preguntado:

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

Si tiene directorios diferentes y está utilizando la autenticación asp.net, es muy fácil. Todo lo que necesita es poner el archivo web.config en cada directorio y definir roles que puedan acceder a los archivos en ese directorio de esta manera:

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

Puede obtener más detalles en este artículo en MSDN

Puede configurar todo en web.config principal de esta 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 este artículo en MSDN:)

EDITAR:

En su método de carga de página, haga esto:

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

¡Espero que esto te ayude!

Puede redirigirlo en la página de índice, diciéndole que no puede acceder a esa página;)

Bueno, ¿por qué no capturas el directorio en la página de inicio de sesión? Si la página de inicio de sesión puede determinar a qué directorio intenta acceder el usuario, tal vez pueda redirigirse a la página correcta según el rol. Si alguien intenta ir a / admin, y la autenticación se realiza correctamente, puede verificar si tienen acceso allí. De lo contrario, puede redirigir a la página de inicio básica indicando que no tienen acceso o puede redirigirlos a la página de inicio del rol.

EDITAR: Probablemente podría hacer la redirección en el evento LoggedIn del control.

Otra opción es establecer una variable de sesión cuando verifica los derechos y lo muestra en la página de inicio de sesión.

Para que puedas 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") = "";
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top