manage - ASP.Net MVC 3 Redirigir al usuario no autorizado para que no inicie sesiónUrl
mvc security (6)
Tengo un proyecto que usa ASP.Net MVC3 y uso de membresía para roles. Yo uso autorizar en cada controlador. p.ej:
[Authorize(Roles = "Administrator")]
public ActionResult Index(string q, int i)
{
return View(model);
}
Si alguien no tiene un rol de administrador, se redirigirá a la página de inicio de sesión de forma predeterminada. ¿Cómo cambiarlo, para que se redirija a Views / Shared / UnAuthorize.cshtml? ¿O tal vez si alguien no tiene un rol de administrador, se mostrará un cuadro de mensaje (alerta)?
gracias por adelantado.
Bueno, puede heredar de AuthorizeAttribute
y anular HandleUnauthorizedRequest
que es responsable de la redirección de solicitudes no autorizadas / no autenticadas. Creo que esta pregunta te será útil.
El siguiente código ayudó y aquí está la referencia en el atributo Autorizado personalizado de ASP.NET MVC 4: ¿Cómo redirigir a los usuarios no autorizados a la página de error?
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" }));
}
}
}
Mi propia versión, basada en ntep vodka''s:
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, obtengo un redireccionamiento estándar a la página de inicio de sesión para usuarios no autenticados, y un redireccionamiento personalizado para usuarios autenticados pero que no tienen el rol adecuado para la acción.
Simplemente cambie la página que debe mostrarse en web.config (verifique que exista la ruta)
<authentication mode="Forms">
<forms loginUrl="~/UnAuthorize" timeout="2880" />
</authentication>
Si, en cambio, desea redirigir a una ruta específica para cada función, puede extender el AuthorizeAttribute con la suya. Algo como esto (no probado, escribo esto para darle 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);
}
}
Yo uso este método y es muy fácil de implementar.
Cambie su ruta predeterminada para iniciar sesión en global.asax
resolví mi problema solo 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 aplique MyAuthorize a la clase o acción:
[MyAuthorize]
public class AdminController :Controller
{
}
Eso es.