2012-09-17 3 views
5

MVC 응용 프로그램에 대한 새 권한 기반 액세스 방법을 구현하려고합니다. 허가 그룹이 있으며 각 그룹에는 허가의 목록이 포함되어 있습니다. 예를 들어 CreateInvoice,RemoveInvoice,etc 권한 키가 포함 된 Invoices 권한 그룹이 있습니다.C# 속성 : enum 상수를 입력 매개 변수로 사용

각 접근법 Action에는 실행을위한 특정 권한이 필요합니다. 나는 CustomAttributes을 통해이 같은 것을이 작업을 수행하기 위해 노력하고있어 :

public class InvoiceController : Controller 
    { 
     [RequirePermission(Permissions.Invoices.CreateInvoice)] 
     public ActionResult Create() 
     { 
      return View(); 
     } 
    } 

은 쉽게 개발자가 나는 권한의 미리 정의 된 목록을 만들려고 해요 다른 권한 그룹 및 권한 키를 기억 할 수 있도록하기 위해이해야 권한 그룹과 권한 키의 조합이어야합니다. 하지만 C# 에서 속성 인수를 사용하는 데 적용되는 제한 사항으로 인해 아직 작동하지 못했습니다.

내 마지막 시도는 각 권한 그룹에 대한 열거를 생성 한 후 거기에 열거 상수로 권한 키를 정의 (나는 초대형 enumurator을하고 거기에 모든 권한 열쇠를 넣어하지 않음) :

public class PermissionEnums 
{ 
    [PermissionGroup(PermissionGroupCode.Invoice)] 
    public enum Invoices 
    { 
     CreateInvoice = 1, 
     UpdateInvoice = 2, 
     RemoveInvoice = 3, 
     ManageAttachments = 4 
    } 

    [PermissionGroup(PermissionGroupCode.UserAccounts)] 
    public enum UserAccounts 
    { 
     Create = 1, 
     ChangePassword = 2 
    } 
} 

여기서 볼 수 있듯이 PermissionGroup 속성을 사용하여 지정된 사용 권한 그룹 키와 각 열거 형 상수에 숫자 코드로 지정된 사용 권한 키 코드가 있습니다. 다음과 같이 정의

RequirePermission 속성 :

public class RequirePermissionAttribute : Attribute 
{ 
    private Enum _Permission; 

    public RequirePermissionAttribute(Enum Permission) 
     : base() 
    { 
     _Permission = Permission; 
    } 
} 

하지만 문제 유형 Enum의 객체 속성 인수로 사용할 수 없습니다 수 있습니다./미안 :

어떤 제안/아이디어는

답변

6

해결 방법을 찾았습니다. 구성 매개 변수 유형 만 변경하면됩니다. 대신 Enum을 사용하는 당신은 object를 사용할 필요가 : 여기

public class RequirePermissionAttribute : AuthorizeAttribute 
{ 
    private object _Permission; 

    public RequirePermissionAttribute(object Permission) 
     : base() 
    { 
     _Permission = Permission; 
    } 
} 

는 전체 코드입니다 :

/***************** Permission Groups And Keys *****************/ 
public static class Permissions 
{ 
    [PermissionGroup(PermissionGroupCode.Invoice)] 
    public enum Invoices 
    { 
     CreateInvoice = 1, 
     UpdateInvoice = 2, 
     RemoveInvoice = 3, 
     ManageAttachments = 4 
    } 

    [PermissionGroup(PermissionGroupCode.UserAccounts)] 
    public enum UserAccounts 
    { 
     Create = 1, 
     ChangePassword = 2 
    } 
} 

public enum PermissionGroupCode 
{ 
    Invoice = 1, 
    UserAccounts = 2, 
    Members = 3 
} 

/***************** Attributes & ActionFilters *****************/ 

[AttributeUsage(AttributeTargets.Enum)] 
public class PermissionGroupAttribute : Attribute 
{ 
    private PermissionGroupCode _GroupCode; 
    public PermissionGroupCode GroupCode 
    { 
     get 
     { 
      return _GroupCode; 
     } 
    } 

    public PermissionGroupAttribute(PermissionGroupCode GroupCode) 
    { 
     _GroupCode = GroupCode; 
    } 
} 


public class RequirePermissionAttribute : AuthorizeAttribute 
{ 
    private object _RequiredPermission; 

    public RequirePermissionAttribute(object RequiredPermission) 
     : base() 
    { 
     _RequiredPermission = RequiredPermission; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var permissionGroupMetadata = (PermissionGroupAttribute)_RequiredPermission.GetType().GetCustomAttributes(typeof(PermissionGroupAttribute), false)[0]; 

     var groupCode = permissionGroupMetadata.GroupCode; 
     var permissionCode = Convert.ToInt32(_RequiredPermission); 

     return HasPermission(currentUserId, groupCode, permissionCode); 
    } 
} 
0

내가 당신의 일을하려고했으나 실패 가능한 먹으 렴 생각하지 않습니다 감사합니다. 행동에

권한

는 권한 부여와 함께 사용되어야하며,이 같은 자신의 ovveride 뭔가 쓰는 할 수 있습니다 : 당신의 행동에 다음

[AttributeUsage(AttributeTargets.All)] 
    public sealed class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     //Its a piece of code from my app you can modify it to suit your needs or use the base one 
     if (!new CustomIdentity(httpContext.User.Identity.Name).IsAuthenticated) 
     { 
      return false; 
     } 

     return true; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     base.HandleUnauthorizedRequest(filterContext); 

    } 

} 

:

[CustomAuthorizeAttribute(Roles = "FE")] 
public ActionResult Index() 
{ 
    return RedirectToAction("Index", "Documents"); 
} 

그러나 그 여전히 문자열을 당신을 사용하고 작동하려면 사용자 정의 역할 공급자와 결합해야합니다. 내 의견으로는 가치가 있지만 가치가있다.

+0

그래, 내가 그 일을했지만 내 문제가 확인 속성을 (ActionFilter 속성)을 생성하지 않습니다 사용자 권한. 방금 정의 된 사용 권한 상수를 만들려면 일반 문자열 키를 사용하는 것보다 나은 방법이 필요합니다. – sos00

+1

http : //www.vivienchevallier.com/Articles/create-a-custom-authorizeattribute-that-accepts-parameters-of-type-enum 시도해보십시오. – AdrianCogiel

관련 문제