2014-04-04 5 views
0

[Authorize] 속성의 기본 동작을 무시하고 싶습니다. 이 similar question 발견했지만 그것은 매우 오래된 및 MVC 게시 된 이후 몇 반복했다.MVC5의 기본 [권한 부여] 동작을 재정의 하시겠습니까?

권한없는 요청을 별도의 컨트롤러/작업으로 보내려면 별도의 '사용자 지정'속성 클래스를 만들고 모든 컨트롤러/작업에 해당 특성을 적용하지 않는 것이 좋습니다. 전 세계적으로이 작업을 수행하고 이미 [Authorize] 속성으로 구성된 모든 컨트롤러/작업에 영향을 미치고 싶습니다.

이것이 가능합니까?

+1

아니요. 컨트롤러 나 액션을'Authorize'로 꾸미면이를'AuthorizeAttribute' 객체에 연결합니다. 당신은 자신의 MVC 어셈블리를 만들고 싶지 않다면 분명히 그 객체의 소스를 편집 할 수 없습니다. 가장 좋은 방법은 그것으로부터 파생되어 다른 게시물에 설명 된대로 적절한 메소드를 오버라이드하는 것입니다. –

+0

감사합니다. @ChrisHardie! 위의 게시물을 사용자 지정 속성을 사용하여 만든 방법으로 업데이트했습니다. – FrankO

+0

FWIW, 이것은'AuthorizeAttribute'가 아닙니다. 특정 액션에 대한 액세스 권한이없는 인증 된 사용자에 대해 적절한 403 응답을 반환합니다. 양식 인증은 실제로 여기에 범인입니다. 401 (인증되지 않음)과 403 (인증되었지만 인증되지 않음)을 모두 차단하고 로그인 페이지로 리디렉션합니다. 그것도 멈추는 방법이없는 것 같습니다. 401 또는 403을 반환하기 전에 작업 내의 리디렉션 (ASP.NET 4.5 이상)을 수동으로 비활성화 할 수 있지만 두 가지 상태 코드 중 하나만 사용할 수는 없습니다. –

답변

0

확인. 전역 적으로 그리고 장소에서 [Authorize] 속성을 재정의 할 방법이 없으므로 여기에 어떻게 완료했는지 설명합니다.

응용 프로그램의 전역 네임 스페이스에 새로운 사용자 정의 AuthorizeAttribute 클래스를 만듭니다 (내 CustomAuthorizeAttribute이라고 함). 이 클래스 파일을 Extend (MVC 프레임 워크를 확장 할 때 모든 사용자 정의 클래스를 넣는 곳) 폴더에 배치하고 내 응용 프로그램의 루트 네임 스페이스와 동일한 네임 스페이스인지 확인했습니다 (모든 컨트롤러에서 '볼 수있는'방법).).

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace CustomProject 
{ 
    public class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      System.Web.Routing.RouteValueDictionary rd; 
      if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       rd = new System.Web.Routing.RouteValueDictionary(new { action = "NotAuthorized", controller = "Error" }); 
      } 
      else 
      { 
       //user is not authenticated 
       rd = new System.Web.Routing.RouteValueDictionary(new { action = "Login", controller = "Account" }); 
      } 
      filterContext.Result = new RedirectToRouteResult(rd); 
     } 
    } 
} 

CustomAuthorizeAttribute 계정 인증 된 사용자 시나리오에 소요/적절하게 리디렉션 다시 라우팅합니다.

그러면 응용 프로그램에 구성한 역할을 사용하여 [CustomAuthorize(Roles="Admin")]을 컨트롤러 및/또는 감시하려는 작업에 추가해야합니다.

또한 오류를 처리하고 내 요구에 "NotAuthorized"작업을 추가하기 위해 ErrorController을 만들었습니다. 원하는 경우 확실히 확장 할 수 있습니다. 일부 로깅을 포함 할 수 있습니까?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace HypeKick.BankUI.Controllers 
{ 
    public class ErrorController : Controller 
    { 
     // 
     // GET: /Error/ 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult NotAuthorized() 
     { 
      return View(); 
     } 
} 
} 

필요한보기를 만드는 것을 잊지 마세요!