2013-03-16 2 views
4

내 MVC4 앱에서 세부적인 권한을 처리하기 위해 만든 사용자 지정 AuthorizeAttribute 클래스가 있습니다.다중 역할 멤버십을 허용하는 사용자 지정 MVC AuthorizeAttribute

[isAuthorized(enRole = oRoles.StudentLookup)] 
    [isAuthorized(enRole = oRoles.StaffLookup)] 
    [isAuthorized(enRole = oRoles.StudentChangeRequest)] 
    [isAuthorized(enRole = oRoles.StaffChangeRequest)] 
:

public enum oRoles 
{ 
    StudentSelfPassword = 1, 
    StaffSelfPassword = 2, 
    StudentLookup = 3, 
    StudentChangeRequest = 4, 
    StudentAdmin = 5, 
    StaffLookup = 6, 
    StaffChangeRequest = 7, 
    StaffAdmin = 8, 
    ChangeQueueApproval = 9 
} 

내 컨트롤러에서 나는하여 AuthorizeAttribute 전화 : 나는 코드가 도움이 허용하는 선언 다음 열거있어

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public class isAuthorized : AuthorizeAttribute 
{ 
    public oRoles enRole; 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     string test = enRole.ToString(); 
     if (!authorized) 
     { 
      // The user is not authenticated 
      return false; 
     } 

     var user = httpContext.User; 

     bool bFlag = AuthCheck.CheckUser(httpContext, enRole); 
     if (bFlag) // I know this is a lot of code; it's for debugging purposes 
      return true; 

     return false; 
    } 
} 

:

클래스입니다

디버거를 통해 실행하면 첫 번째 isAuthorized가 실행되고 true를 반환하고 두 번째 isAuthorized로 돌아가 거짓을 반환하면 즉시 인증을 요청합니다. 첫 번째 조건이 참 이었기 때문에 허용 할 것으로 기대했습니다. 그러나, 내 가정이 옳지 않은 것 같습니다.

원래 도메인의 그룹 인 Roles = "change, admin"이 있었지만 작동했지만 그룹은 정적이 아닌 할당에서 동적이어야했습니다. 나는 거기에 여러 항목을 밀어 수있었습니다. 그것은 문자열로 전송 되었기 때문입니까?

기본적으로 isAuthorized (...)를 수행하는 방법이 있습니까? isAuthorized (...) || isAuthorized (...) 하나의 조건이 참이면 ok로 확인됩니다.

답변

8

속성에 단일 oRole 속성이있는 대신 속성 목록 또는 역할 배열을 사용할 수 있습니까? 그리고 많은 수의 속성을 두는 대신 하나의 속성으로 메소드를 꾸미고 허용 된 역할의 배열을 전달하십시오.

[isAuthorized(enRoles = new oRoles[]{oRoles.StudentLookup, oRoles.StaffLookup })] 

여러 값을 사용하는 속성을 만드는 예는 사용자가 제공 한 모든 허용 된 목록에 대해 확인할 수있는 코드를 확인 권한 부여에 그런 here

입니다. 아래 코드와 같은 것

bool bFlag = enRoles.ToList().Any(r => AuthCheck.CheckUser(httpContext, r)); 
+0

나는이 사이트를 사랑한다! 정말 고맙습니다; 그게 도움이 됐어! –

+0

그리고 보너스! 감사! –

관련 문제