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
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top