2016-12-13 5 views
3

현재 사용자 역할을 기반으로하는 새로운 ASP MVC 5 응용 프로그램에서 보안을 구현하려고합니다. 목표는 특정 역할 (또는 그 이상)이없는 경우 사용자가 특정 컨트롤러 또는 컨트롤러 방법에 액세스하지 못하게하는 것입니다. 지금까지 질문에 읽은 것을 바탕으로, 나는이 (MyAppRole가 BTW, 열거하다)과 같은 AuthorizeAttribute을 상속 속성 생성 :AuthorizeAttribute에서 상속하는 특성이 작동하지 않습니다.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class AuthorizeRoleOrSuperiorAttribute : AuthorizeAttribute 
{ 
    private MyAppRole _authorizedRole; 

    public AuthorizeRoleOrSuperiorAttribute(MyAppRole authorizedRole) 
    { //Breakpoint here 
     _authorizedRole = authorizedRole; 
    } 

    public override void OnAuthorization(HttpActionContext actionContext) 
    { //Breakpoint here 
     base.OnAuthorization(actionContext); 

     if (!UserInfo.GetUserRoles().Any(r => (int)r >= (int)_authorizedRole)) 
      throw new UnauthorizedAccessException(ErrorsModule.RoleMissing); 
    } 
} 

을 그리고 난 방법 및 /에이 방법으로 호출 또는 컨트롤러 :

[AuthorizeRoleOrSuperior(MyAppRole.Admin)] 
public class MyController : Controller 
{ 
    [AuthorizeRoleOrSuperior(MyAppRole.Admin)] 
    public ViewResult Index() 
    { 
     [...] 
    } 

    [...] 
} 

나는 비록, 생성자와 OnAuthorization 방법하지만, 내가 응용 프로그램을 실행하고 관련 컨트롤러 또는 메서드를 호출 할 때, 나는 그들 중 하나를 명중하지 않으며 조치라고 결코에 브레이크 포인트를 배치 나는 심지어 로그인하지도 않았다.

참고 : AuthorizeAttribute는 사용할 때 제대로 작동합니다.

속성이 액세스 및 필터 액세스를 방해 할 수있는 이유는 무엇입니까?

답변

3

System.Web.Http.AuthorizeAttribute에서 특성을 상속 받고 있습니까? 그것은 System.Web.Mvc.AuthorizeAttribute와는 다르게 작동합니다.

대신 System.Web.Mvc.AuthorizeAttribute에서 상속 해보십시오.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class AuthorizeRoleOrSuperiorAttribute : System.Web.Mvc.AuthorizeAttribute 
{ 
    private MyAppRole _authorizedRole; 

    public AuthorizeRoleOrSuperiorAttribute(MyAppRole authorizedRole) 
    { //Breakpoint here 
     _authorizedRole = authorizedRole; 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { //Breakpoint here 
     base.OnAuthorization(filterContext); 

     if (!UserInfo.GetUserRoles().Any(r => (int)r >= (int)_authorizedRole)) 
      throw new UnauthorizedAccessException(ErrorsModule.RoleMissing); 
    } 
} 

적어도 중단 점을 맞추어야합니다.

주 매개 변수의 차이에 : OnAuthorization(AuthorizationContext filterContext)public override void OnAuthorization(HttpActionContext actionContext)

또한 올바른 401 HTTP 상태 코드를 얻을 수 filterContext.Result = new HttpUnauthorizedResult();을 설정할 수 있습니다.

+0

고마워, 그게 내가 찾고 있던 모든 것이었고 이제 모든 것이 의도 한대로 작동한다. 이제부터는 상속 된 클래스의 네임 스페이스에주의를 기울이는 것을 잊지 않을 것입니다 ... – ZipionLive