Program Tip

사용자 지정 AuthorizeAttribute 클래스 내에서 RedirectToAction ()을 사용할 수 있습니까?

programtip 2020. 12. 15. 19:44
반응형

사용자 지정 AuthorizeAttribute 클래스 내에서 RedirectToAction ()을 사용할 수 있습니까?


ASP.Net MVC 2를 사용하면 클래스를 기반으로하는 클래스 에서 Controller 클래스 RedirectToAction () 메서드 를 사용할 수있는 방법이 있습니까?AuthorizeAttribute

public class CustomAttribute : AuthorizeAttribute {
    protected override bool AuthorizeCore(HttpContextBase context) {
        // Custom authentication goes here
        return false;
    }

    public override void OnAuthorization(AuthorizationContext context) {
        base.OnAuthorization(context);

        // This would be my ideal result
        context.Result = RedirectToAction("Action", "Controller");
    }
}

로그인 페이지로 돌아가는 대신 인증에 실패하면 사용자를 특정 컨트롤러 / 작업으로 리디렉션하는 방법을 찾고 있습니다. 해당 컨트롤러 / 액션에 대해 리디렉션 URL을 생성 한 다음 RedirectResult () 를 사용할 수 있습니까? URL을 하드 코딩하려는 유혹을 피하려고합니다.


당신은 / 오버라이드 (override) 할 필요가 있습니다 HandleUnauthorizedRequest대신 OnAuthorization. 다음은 기본 구현입니다.

    protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
        filterContext.Result = new HttpUnauthorizedResult();
    }

당신은 사용할 수 없습니다 Controller.RedirectToAction,하지만 당신은 수있는 새로운를 반환 RedirectToRouteResult.

따라서 다음을 수행 할 수 있습니다.

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
        filterContext.Result = new RedirectToRouteResult(
                                   new RouteValueDictionary 
                                   {
                                       { "action", "ActionName" },
                                       { "controller", "ControllerName" }
                                   });
    }

다음과 같이 할 수 있습니다.

var routeValues = new RouteValueDictionary();
routeValues["controller"] = "ControllerName";
routeValues["action"] = "ActionName";
//Other route values if needed.
context.Result = new RedirectToRouteResult(routeValues);

이것이 컨트롤러에서 "RedirectToAction ()"을 호출 할 때 프레임 워크가 수행하는 방식입니다.


다른 사람이이 질문에 관심이있는 경우. 이것은 더 간단한 방법으로 해결할 수 있습니다 (최소한 MVC 3을 사용하면 MVC 2에 대해 알지 못함).

사용자 지정 AuthorizeAttribute에 작은 개인 컨트롤러를 생성하기 만하면됩니다.

    private class RedirectController : Controller
    {
        public ActionResult RedirectWhereever()
        {
            return RedirectToAction("Action", "Controller");
        }

    }

이것은 HandleUnauthorizedRequest 메서드에서 쉽게 사용할 수 있습니다 (Craigs 답변 참조).

filterContext.Result = (new RedirectController()).RedirectWhereever();

참조 URL : https://stackoverflow.com/questions/2472578/is-it-possible-to-use-redirecttoaction-inside-a-custom-authorizeattribute-clas

반응형