ACTUALIZACIÓN (jun 2015): @ daniel-lidström ha señalado correctamente que no debe usar Response.Redirect en una aplicación ASP.NET MVC. Para obtener más información acerca de por qué, consulte este enlace: Response.Redirect and ASP.NET MVC – Do Not Mix.
ACTUALIZACIÓN (sep 2014): no estoy seguro de que cuando se añadió a la HandleUnauthorizedRequest AuthorizeAttribute, pero de cualquier manera he sido capaz de refinar el código AuthorizeRedirect en algo más pequeño y más simple.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{
public string RedirectUrl = "~/Error/Unauthorized";
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
if (filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectResult(RedirectUrl);
}
}
}
respuesta original Abajo (aún completamente funcional)
He dejado esta respuesta aquí, ya que todavía le da una idea de cómo las obras de canalización de autorización.
Para cualquier persona que aún aterrice aquí, he editado la respuesta de Ben Scheirman para redirigir automáticamente a una página no autorizada cuando el usuario está conectado pero no autorizado. Puede cambiar la ruta de redireccionamiento utilizando el parámetro de nombre RedirectUrl.
EDIT: He hecho las soluciones compatibles con el proceso gracias a los consejos de Tarynn y MSDN
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{
private const string IS_AUTHORIZED = "isAuthorized";
public string RedirectUrl = "~/error/unauthorized";
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
bool isAuthorized = base.AuthorizeCore(httpContext);
httpContext.Items.Add(IS_AUTHORIZED, isAuthorized);
return isAuthorized;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var isAuthorized = filterContext.HttpContext.Items[IS_AUTHORIZED] != null
? Convert.ToBoolean(filterContext.HttpContext.Items[IS_AUTHORIZED])
: false;
if (!isAuthorized && filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl);
}
}
}
Fácil de implementar y funciona. Gracias. –
Gracias Ben, ¡implemento lo mismo de mi lado y trabajo muy bien! –
Se acepta esta respuesta, pero no es segura para subprocesos, consulte la respuesta a continuación para obtener más detalles. Actualice su código para que sea seguro para subprocesos, muchos desarrolladores pueden no leer otras respuestas y usar la suya como la mejor. –