MVC 4 ARVERIZEATTRIBUTE.HandleunAuthorizedRequest ViewResult - бесконечная петля

StackOverflow https://stackoverflow.com//questions/20012795

Вопрос

Я выходил через мой код в миллион раз и не могу найти проблему с моей реализацией ..

в пользовательском авторизеаэметеээзеаэметеаэмете, я перезаписал 2 метода

    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);
     }
.

Логика авторизации издевается, чтобы вернуть false только на конкретный контроллер, и я перешел через это, чтобы убедиться, что он работает правильно.

Вышеуказанный код приведет к тому, что бесконечный цикл.В моем журнале я вижу, что линия ударила 666 раз (совпадение?) ..

Если я сделаю база Call.handleunAuthorizedRequest (CTX), все, что я получаю, это пустая страница.поэтому я отражал, что делает базу, и это это

filterContext.Result = new HttpUnauthorizedResult();
.

Итак, это объясняет, почему он отображает пустую страницу вместо перенаправления на несанкционированную .CSHTML.То, о чем я не уверен, поэтому он идет в бесконечную петлю, если я не называю базу.

p.s.

Я проверил, что если я положу неправильный несанкционированный просмотр, это будет ошибка (но все еще висит на неопределенный срок)

 System.InvalidOperationException: The view 'Unauthorized11' or its master was not found or no view engine supports the searched locations
.

Это было полезно?

Решение

Вот реализация, с которой я оказался, и он очень хорошо работает.

    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;
            }
        }
    }
.

Другие советы

Реализация по умолчанию AverizeAttribute устанавливает ответ на контекст действия, не вызывая в базе, который не может быть установлен, что заставляет фильтр повторить процесс авторизации до тех пор, пока не будет установлен ответ (отсюда и бесконечный цикл).

Вы можете увидеть эту логику в authorizationfilterattribute класс, который авторизуариттрибует от.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top