2011-09-02 4 views
1

CodeAccessSecurity을 기반으로하는 사용자 지정 권한 기반 선언 권한 부여 메커니즘을 사용할 계획입니다. 내가 이런 식으로 사용CodeAccessSecurity를 ​​사용하는 WCF 선언적 보안

[Serializable] 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] 
public class RequirePermissionAttribute : CodeAccessSecurityAttribute { 

    private static readonly IPermission _deny = new SecurityPermission(PermissionState.None); 
    private static readonly IPermission _allow = new SecurityPermission(PermissionState.Unrestricted); 

    public RequirePermissionAttribute(SecurityAction action) 
     : base(action) { 
    } 

    public string Permission { get; set; } 

    public override IPermission CreatePermission() { 
     if (User.HasPermission(Permission)) 
      return _allow; 
     else 
      return _deny; 
    } 
} 

:

[ServiceContract] 
public class Service { 

    [OperationContract] 
    [RequirePermission(SecurityAction.Demand, Permission = "GetArbitaryProduct")] 
    public User GetProduct(string name) { 
     return _productRepository.Get(name); 
    } 
} 

을 내가 CreatePermission 방법을 반환하는 경우 GetProduct-_deny 접근이 제한 될 것으로 예상 그것을 구현하기 위해 나는 CodeAccessSecurityAttribute에서 파생 된 다음 서브 클래스를 만들었습니다 . 그러나 그것은 CodeAccessSecurity이 이런 식으로 작동하지 않는 것 같습니다. 액세스를 올바르게 제한하기 위해 예외를 throw해야합니까? 아니면 그것을 달성하는 더 우아한 방법이 있을까요?

답변

1

CodeAccessSecurityAttribute 하위 클래스 인스턴스를 기반으로 권한 확인을 연결하는 CLR 메커니즘은 CreatePermission()에 의해 반환 된 권한이 평가 될 때 예외가 throw되는 경우에만 대상 메서드 실행을 차단합니다. 권한 동작으로 SecurityAction.Demand를 지정하기 때문에 권한의 Demand() 메서드가 대상 메서드의 실행을 피하기 위해 throw해야합니다.

많은 권한 부여 시나리오를 처리 할 수있는 많은 방법이 있으며, 그 중 많은 것을 "고급"이라고 생각할 수 있습니다. 그러나 대체 접근법을 찾기 전에 서비스 호출자가 인증이 거부 될 때 어떤 행동을 관찰해야하는지 고려하는 것이 가장 좋습니다. 이 메소드가 성공하기를 원하지만 null을 반환하겠습니까, 아니면 오류를 반환 하시겠습니까? 후자의 경우 유형이 잘못되었거나 잘못 되었으면 좋겠습니까?

+0

현재 문제가되지 않습니다. 발신자에게 어떤 요구 사항도 없으므로 원하는대로 구현할 수 있습니다. 그러나 형체가 잘못되었다고 생각합니다. – sam

+0

입력 된 오류를 선호하는 경우 SecurityException을 던져 버릴 수있는 권한을 부여하는 기본 경로로 이동하는 것이 가장 간단한 방법 일 수 있습니다. WCF 클라이언트 (http://msdn.microsoft.com/en-us/magazine/cc948343.aspx#id0070004)에서 SecurityAccessDeniedException에 매핑되는 오류가 WCF 내부에 자동으로 생성됩니다. –