2013-04-18 2 views
0

특정 플러그인 사용 권한 및 메서드 보안 권한을 자동으로 테스트하는 보안 메커니즘을 구현하려고하는데이 작업을 수행하는 방법에 대해 조금만 고민해 왔습니다. 이 플러그인이 부여하는 모든 권한의 배열을 포함특성 사용법 확인 방법 사용 권한

params PluginPermission[] permission 

:

내가 좋아하는 생성자 속성을 취하는 사용자 정의 MEF 메타 데이터 속성을 작성했습니다.

PluginPermission.cs 

public enum PluginPermission 
{ 
    CreateUsers, 
    DeleteUsers, 
    ReadPassword, 
    WritePassword, 
    AddUsersToGroups, 
    AddGroups, 
    DeleteGroups 
} 

나는 또한 각각의 방법을 대상으로 실행되는 개인 방법에 필요한 권한에 시스템에게 하나 개 이상의 PluginPermission 객체를 취하는 RequiredPermissionAttribute를 작성했습니다 :

PluginPermission 클래스처럼 보인다 . 플러그인 메소드가 실행되지 않는 특정 방법에 필요한 권한이없는 경우 분명히

ILicensingManagement.cs 

[RequiredPermission(PluginPermission.CreateUsers)] 
bool AddUser(string userName); 

:이처럼 플러그인의 인터페이스에 적용됩니다.

내가 붙어있는 것은 메서드가 실행되기 전에 실행되는 RequiredPermissionAttribute 클래스의 테스트 메서드를 실제로 얻는 방법과 메서드에 대한 사용 권한 요구 사항이 해당 플러그 인에 의해 충족되지 않으면 정상적으로 실행을 종료하는 방법입니다.

xUnit BeforeAfterTestAttribute를 살펴 보았지만 구현이 너무 구체적으로 보였으므로 솔루션에 도달하기 위해 소스 코드를 분리하려고 모호했습니다.

답변

0

MEF의 특정 사항에 대해서는 언급 할 수 없지만 맞춤 속성은 "태그"이상에 불과하다는 점을 명심해야합니다. 예를 들어 리플렉션을 사용하여 코드에서 구체적으로 검사하지 않는 한 아무 것도하지 않습니다.

xUnit은 리플렉션을 사용하여 메소드를 실행하기 때문에 아마도 xUnit의 BeforeAfterTestAttribute이 작동합니다. 이 속성을 만나면 그에 따라 행동이 바뀝니다.

.NET Framework 네임 스페이스의 특성은 CLR이 해당 개체 나 컴파일러에서 확인하기 때문에 작동합니다.

나는 이것이 정말로 당신의 질문에 완전히 대답하지 않는다는 것을 알고 있지만, 코멘트에 넣기에는 너무 길다.

업데이트 : 클래스 인 경우 Type을 사용하거나 메소드 인 경우 MethodInfo을 사용하여 속성에 액세스 할 수 있습니다. 예 :

MethodInfo mi = /* method info */; 
Attribute[] attrs = mi.GetCustomAttributes(typeof(RequiredPermissionAttribute), false); 
RequiredPermissionAttribute req = attrs.Cast<RequiredPermissionAttribute>().FirstOrDefault(); 

if ((req != null) && (/* current user does not have the required permission */)) throw new Exception(); 

그러나 실제 보안 솔루션이 아니기 때문에 개발자는 이러한 확인을 쉽게 피할 수 있습니다. 잠시 훑어 봤지만 PostSharp가 도움이 될 수도 있습니다.

+0

사실, 이미 일부 사용 권한과 wotnot을 확인하기 위해 리플렉션을 사용하고 있으며 필요한 메소드 권한에 대해 부여 된 클래스 수준 사용 권한의 테스트를 실제로 수행하는 로직을 주입하는 방법에 조금 갇혀 있습니다. 실제로 속성은 꽤 "벙어리"이며 꾸미는 것 이상입니다. – Jammer

+0

플러그인이 필요하거나 수행 할 수있는 기능에 대해 사용자 보안 측면에서 어떤 것도 시행하지 않는 것은 아닙니다. 우리의 사용자 보안은 모두 LDAP에서 구현됩니다. 의견을 보내 주셔서 감사합니다. – Jammer