문제

나는 수백만 번의 코드를 밟았으며, 구현에 문제가 없다.

사용자 정의 AuthorizeAttribute에서는 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 회 (우연의 일치 ")를 볼 수 있습니다.

i base.HandleUnauthorizedRequest (CTX)를 호출하면 빈 페이지는 빈 페이지입니다.그래서 나는 기초가하는 것을 반영했고,이게

filterContext.Result = new HttpUnauthorizedResult();
.

그래서 이것은 unauthorized.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;
            }
        }
    }
.

다른 팁

의 기본 구현AuthorizeAttribute 작업 컨텍스트에 대한 응답을 설정합니다. 기본 사항은 응답이 설정 될 때까지 필터가 인증 프로세스를 반복하도록 허용 프로세스를 반복하지 않게합니다 (따라서 무한 루프).

이 논리는 AuthorizatizeAttribute가 파생 된 AuthorizeAttribute 클래스를 볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top