16

Tengo un proyecto que usa ASP.Net MVC3 y uso la membresía para roles. Yo uso authorize en cada controlador. por ejemplo:ASP.Net MVC 3 Redireccionar Usuario no autorizado no iniciar sesiónUrl

[Authorize(Roles = "Administrator")] 
    public ActionResult Index(string q, int i) 
    { 
     return View(model); 
    } 

si alguien imposible tener el papel de administrador, a continuación, volverá a dirigir a la página de acceso por defecto. cómo cambiarlo, por lo que se redireccionará a Views/Shared/UnAuthorize.cshtml? o tal vez, si alguien no tiene un rol de administrador, ¿mostrará el cuadro de mensaje (alerta)?

gracias de antemano.

Respuesta

11

Sólo cambia la página que tiene que ser mostrado en el web.config (comprobar que existe la ruta)

<authentication mode="Forms"> 
    <forms loginUrl="~/UnAuthorize" timeout="2880" /> 
</authentication> 

Si, en cambio, quiere volver a dirigir a una ruta específica para cada función, puede ampliar AuthorizeAttribute con la suya. Algo como esto (no probado, escribo esto para que tenga una idea)

public class CheckAuthorize : ActionFilterAttribute 
{ 
    public Roles[] Roles { get; set; } 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    //Your code to get the user 
    var user = ((ControllerBase)filterContext.Controller).GetUser(); 

    if (user != null) 
    { 
     foreach (Role role in Roles) 
     { 
     if (role == user.Role) 
      return; 
     } 
    }  
    RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
    if user.Role==Role.Administrator 
    { 
     redirectTargetDictionary.Add("action", "Unauthorized"); 
     redirectTargetDictionary.Add("controller", "Home"); 
    } 
    else 
    { 
     redirectTargetDictionary.Add("action", "Logon"); 
     redirectTargetDictionary.Add("controller", "Home"); 
    } 
    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 
    } 
} 
+1

gracias, me ayudaste de nuevo :) –

+2

Esta solución dará como resultado el redireccionamiento a la página no autorizada tanto para las solicitudes no autenticadas como no autenticadas –

+0

Eso es cierto. Implementé mi respuesta para reflejar tu punto. – Iridio

3

Bueno, puede heredar de AuthorizeAttribute y anular HandleUnauthorizedRequest que es responsable de la redirección de solicitudes no autorizadas/no autenticadas. Creo que this question será útil para usted

+0

gracias, que me puede dar exampel código? –

+0

la pregunta a la que me refería contiene el código de ejemplo. si hay un problema por favor déjame saber –

23

he resuelto mi problema. Yo sólo hago esto:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

public class MyAuthorize : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
    //you can change to any controller or html page. 
    filterContext.Result = new RedirectResult("/cpanel/roles/unauthorize"); 

    } 
} 

y aplicar MyAuthorize a clase o acción:

[MyAuthorize] 
public class AdminController :Controller 
{ 
} 

eso es todo.

0

Utilizo este método y es muy fácil de implementar.

Securing Asp.net MVC3

cambiar la ruta por defecto para iniciar sesión en la página Global.asax

1

mi propia versión, sobre la base de vodka de NTEP:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if(IsUserAuthenticated(filterContext.HttpContext)) 
     { 
      filterContext.Result = new RedirectResult("/Account/InvalidRole"); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 

    private bool IsUserAuthenticated(HttpContextBase context) 
    { 
     return context.User != null && context.User.Identity != null && context.User.Identity.IsAuthenticated; 
    } 
} 

De esta manera me sale redirección estándar de página de acceso para usuarios no autenticados, y redirección personalizada para usuarios que están autenticados pero que no tienen el rol apropiado para la acción.

1

El código de abajo ayudó y aquí está la referencia en stackoverflow ASP.NET MVC 4 custom Authorize attribute - How to redirect unauthorized users to error page?

public class CustomAuthorize: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if(!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
      RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" })); 
     } 
    } 
} 
Cuestiones relacionadas