2011-01-29 9 views
20

Necesito que mis usuarios sean redirigidos a la página AuthError.aspx ("No tiene acceso a esta página") en el caso en que están autenticados pero intentan acceder a la página a la que no pueden acceder (debido a la función de examen). Si configuro web.config así:¿Cómo redirigir a los usuarios a una página ASP.NET cuando no está autorizado?

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> 
</authentication> 

este es un comportamiento incorrecto del sistema, ya que un usuario ya está autenticado y no hay necesidad de que él o ella redirigir a la página. Pero si escribo aquí AuthError.aspx en su lugar Login.aspx, ¿cómo puedo redirigir a un usuario aún no autenticado a la página de inicio de sesión?

+2

Siento tu dolor en este caso. Pensé que sería más fácil de hacer, pero tampoco he encontrado una solución para esto. No deseo que los usuarios autenticados pero no autorizados vean la página de inicio de sesión cuando ya hayan iniciado sesión. –

+0

Echa un vistazo a esta publicación. http://stackoverflow.com/questions/14731707/redirect-user-to-another-page-from-web-config-when-his-role-has-not-enough-permi?rq=1 – Nishant

Respuesta

1

es necesario:

1) activar funciones (en web.config): (sustituir 'xxx' con sus propios valores)

<roleManager enabled="true"> 
    <providers> 
    <clear /> 
    <add connectionStringName="ApplicationServices" applicationName="xxx" 
     name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
    <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider" 
     type="System.Web.Security.WindowsTokenRoleProvider" /> 
    </providers> 
</roleManager> 

2) que necesita para restringir el acceso a ciertas áreas de su sitio web para roles específicos. En realidad, hoy respondí otra pregunta donde explico cómo lograr esto. Here es el enlace

+0

Gracias pero todas estas cosas ya están hechas. Tal vez describí mal, pero el problema es que uso roles y archivos locales de configuración web para proteger carpetas, pero no sé cómo redirigir al usuario que intenta acceder a la carpeta inaccesible a la página AuthError.aspx adecuada. – mimic

-1

Usted puede configurar una página personalizada de error como este:

<system.web> 
    <customErrors mode="On">   
    <error statusCode="403" redirect="AuthError.aspx" />  
    </customErrors> 
</system.web> 
+1

Desafortunadamente no funciona. Si lo uso, abre de nuevo la página de inicio de sesión simplemente redirigiendo a AuthError.aspx = ( – mimic

1

Es necesario distinguir entre la autenticación y autorización. El fragmento de código se dirige al primero ("¿Conozco este sitio?") Pero no al último ("¿Tengo permiso para acceder a esta página?").

Como @santiagoIT sugiere, los roles pueden ser la mejor solución para implementar la autorización que necesita. Algunos controles, como LoginView, son conscientes de la función y de la autenticación, por lo que puede usarlos para mostrar contenido diferente según el rol en el que se encuentre el usuario.

Un enfoque común es mostrar diferentes menús a los usuarios de las diferentes funciones, de modo que solo se les presenten menús que sean relevantes para sus roles; a menudo se usa LoginView.

Como alternativa, puede controlar la visibilidad del contenido en páginas individuales, una vez más usando el LoginView, para que los usuarios que no son autenticados reciban un mensaje, los que estén autenticados pero no autorizados para ver la página un segundo mensaje y los que ambos están autenticados y se les permite ver la página ver el contenido.

Si simplemente desea redirigir a un usuario que está autenticado pero no tiene el acceso requerido para ver una página, también puede verificar que el usuario sea el rol apropiado (Roles.IsUserInRole) y redireccionar al "Usted no tiene acceso .. "página si no.

Si realmente es consciente de la seguridad, puede combinar el enfoque restringido de menú/vista con la verificación de la autorización en cada página.

+0

Gracias por la respuesta, pero prefiero no codificar este comportamiento, sino implementarlo usando web.config. Claro que puedo verificar la accesibilidad dentro de la parte posterior código pero me gustaría hacer eso usando solo web.config. – mimic

23

Por Page_Load de la página de inicio de sesión, tendrá que comprobar si el usuario está autenticado, y si son para redirigir a su página de acceso denegado:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (User.Identity.IsAuthenticated) // if the user is already logged in 
    { 
      Response.Redirect("~/AccessDenied.aspx"); 
    } 
} 

Si usted desea conseguir una Poco más elegante, puede verificar el parámetro ReturnUrl para determinar si el usuario llegó directamente a la página (por ejemplo, a través de un marcador guardado directamente en la página de inicio de sesión) y manejarlo de manera diferente.He aquí un ejemplo:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 

      // if they came to the page directly, ReturnUrl will be null. 
      if (String.IsNullOrEmpty(Request["ReturnUrl"])) 
      { 
       /* in that case, instead of redirecting, I hide the login 
        controls and instead display a message saying that are 
        already logged in. */ 
      } 
      else 
      { 
      Response.Redirect("~/AccessDenied.aspx"); 
      } 
     } 
    } 
+3

+1 Porque esta solución funcionará. Pero ¿es esta la mejor solución? – Ananth

+0

Excelente - Funcionó perfectamente. Gracias. –

+0

Es la mejor que he encontrado hasta ahora –

0

intente esto:

Supongamos que necesita sólo los usuarios de administrador para acceder a la página especificada de los suyos a continuación en el Page_Load se podría escribir esto:

if (User.Identity.IsAuthenticated) 
{ 
    if (!User.IsInRole("Admin")) 
    { 
     Server.Transfer("~/AccessDeniedPage.aspx"); 
    } 

} 

y en caso está utilizando las rutas que puede hacer:

if (User.Identity.IsAuthenticated) 
{ 
    if (!User.IsInRole("Admin")) 
    { 
     Response.RedirectToRoute("AccessDeniedRoute"); 
    } 

} 
1

Para mí, la solución menos molesta n a este problema fue crear otra sección (panel) en la página Login.aspx con los contenidos que se mostrarán a los usuarios que están autenticados (p. ha iniciado sesión) diciendo "Acceso denegado" en lugar del formulario de inicio de sesión. Cuando el usuario conectado accede a la página, significa que lo más probable es que hayan terminado aquí porque no están autenticados para acceder a la página que los redirigió aquí.

En la página de inicio de sesión que utiliza este código muy simple para cambiar la visibilidad de la forma y el panel de entrada:

if (Request.IsAuthenticated) 
{ 
    LoginUser.Visible = false; 
    AccessDeniedPanel.Visible = true; 
} 

Está muerto simple y funciona.

Cuestiones relacionadas