MVC 4 Authorizeattribute.HandleunaUnizedRequest Viewresult - Loop infinito
-
21-12-2019 - |
Domanda
Ho fatto un passo attraverso il mio codice un milione di volte e non riesco a trovare un problema con la mia implementazione ..
In Business Authorizeattribute I Sowrotwot 2 Methods
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.Request.IsAuthenticated)
return false;
var routeData = httpContext.Request.RequestContext.RouteData;
var ctrl = routeData.Values["controller"].ToString();
var action = routeData.Values["action"].ToString();
var user = httpContext.User.Identity.Name;
_logger.Info("[logging all the details]");
return ctrl == "SomeController";
}
protected override void HandleUnauthorizedRequest(AuthorizationContext ctx)
{
ctx.Result = new ViewResult { ViewName = "Unauthorized" };
// base.HandleUnauthorizedRequest(ctx);
}
.
La logica di autorizzazione viene deriscata per restituire false solo su un controller specifico, e ho intenzione di verificarsi per verificare che funzioni correttamente.
sopra il codice causerà il ciclo infinito.Nel mio registro posso vedere quella linea ha colpito 666 volte (coincidenza?) ..
Se chiamo BASE BASE.HandleunaUTHorizedRequest (CTX), tutto Io ottenuto è una pagina vuota.Quindi rifletté ciò che fa la base, ed è questa
filterContext.Result = new HttpUnauthorizedResult();
.
Quindi questo spiega perché rende una pagina vuota invece di reindirizzare a non autorizzato.cshtml.Di cosa non sono sicuro, è il motivo per cui entra in un ciclo infinito se non chiamo la base.
P.S.
Ho verificato che se metto la visualizzazione non autorizzata sbagliata, errorizzeranno (ma ancora si blocca indefinitamente)
System.InvalidOperationException: The view 'Unauthorized11' or its master was not found or no view engine supports the searched locations
. Soluzione
Ecco l'implementazione che ho finito per andare avanti e funziona molto bene.
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
// this is overriden for kendo menus to hide
var ctrl = filterContext.RequestContext.RouteData.GetRequiredString("controller");
var action = filterContext.ActionDescriptor.ActionName;
[custom authorization logic on action/ctrl]
// useful to determine if it's authorizing current controller path or menu links
var path = filterContext.HttpContext.Request.PhysicalPath;
_authorizingCurrentPath = path.Contains(ctrl) || path.EndsWith("WebUI") ;
if (userAuth < requiredAuth)
HandleUnauthorizedRequest(filterContext);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext ctx)
{
if (!ctx.HttpContext.User.Identity.IsAuthenticated)
base.HandleUnauthorizedRequest(ctx);
else {
if (_authorizingCurrentPath) {
// handle controller access
ctx.Result = new ViewResult { ViewName = "Unauthorized" };
ctx.HttpContext.Response.StatusCode = 403;
}
else {
// handle menu links
ctx.Result = new HttpUnauthorizedResult();
ctx.HttpContext.Response.StatusCode = 403;
}
}
}
. Altri suggerimenti
L'implementazione predefinita di Authorizeattribute Imposta la risposta sul contesto dell'azione, non chiamando nella base la risposta non viene mai impostata che fa sì che il filtro ripeti il processo di autorizzazione fino a quando non viene impostata una risposta (quindi il ciclo infinito).
Puoi vedere questa logica in AuthorizationFilTrattribute Classe che autorizzata deriva da.