2009-05-04 9 views
6

Windows 계정을 사용하여 WCF 서비스를 보호하려고합니다. 이 서비스는 언어가 다른 많은 시스템에서 실행되어야합니다. 어떻게하면 언어 독립적 인 역할 이름을 가진 PrincipalPermission을 설정할 수 있습니까?다국어 PrincipalPermission 역할 이름을 설정하는 방법은 무엇입니까?

이 것과 같은 추악한 해결 방법을 발견했습니다.

[PrincipalPermission(SecurityAction.Demand, Role = "Builtin\\Administrators")] // English 
[PrincipalPermission(SecurityAction.Demand, Role = "Vordefiniert\\Administratoren")] // German 
public string HelloWorld() 
{ 
    return "Hello"; 
} 

나는 이것이 좋은 해결책이라고 생각하지 않습니다.이 언어를 독립적으로 만들 수있는 방법이 있습니까? 문자열 대신 계정 SID를 사용하는 방법이 있습니까?

답변

0

흠, 내 코드 (하드 코드)에 직접 그룹 이름을 사용하지 않겠습니다. 이를 "HelloWorldAdmin"과 같은 역할로 추상화하고 app.config에서 역할을 구성하십시오. 이것은 사용자 그룹에 매핑되어야합니다. 이렇게하면 사용자/관리자가 그룹을 선택하여 역할에 매핑 할 수 있습니다 (예 : 애플리케이션 관리자가 귀하가 AD 관리자가 아닌 경우). http://msdn.microsoft.com/en-us/library/ms998314.aspx을 살펴보십시오. HTH.

0

독일어 시스템에서 "BUILTIN \ Administrators"가 작동하지 않는다고 확신합니까? 나는 그때조차도 상상할 것입니다,이 기본적인 그룹 이름은 유효해야합니다. 예, 관리 도구에서 "Vordefiniert \ ADministratoren"이 표시됩니다. 그러나 PrincipalPermission 속성이 언어에 따라 달라지면 놀랄 것입니다.

마크

+1

아니요 작동하지 않습니다. 주 논리는 WindowsPrincipal.IsInRole (string) 메서드에 있습니다. 나는 반사체를보고 역할 이름의 "번역"을 찾지 못했습니다. 그냥 자습 해보십시오. WindowsPrincipal principal = new WindowsPrincipal (WindowsIdentity.GetCurrent()); bool english = principal.IsInRole ("Builtin \\ Administrators"); bool german = principal.IsInRole ("Vordefiniert \\ Administratoren"); 나는 당신이 놀랐던 것처럼, 내가 뭔가를 놓치고있는 것일 수도있다 ... –

+1

나는 놀랐고 기절했다 ..... sowas deppertes auch! Spinnen, die Microsofties :-) –

+0

@marc_s : 과거에 동의합니다. LDAP를 동기화하고 설치 프로그램을 작성할 때 동의합니다. –

1

당신은 필수 버전을 사용하고 동적 (SecurityIdentifier.Translate를 통해 할 수있다) 지역화 된 양식에 언어 중립적 인 형태 (예를 들어, SID)를 변환 할 수 있습니다.

잘 알려진 SID가이 KB에 나와있는 243330.

3

당신은 번역 처리하는 자신의 권한 속성 롤 수 :

[Serializable, AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = false), ComVisible(true)] 
public sealed class AdministratorPrincipalPermissionAttribute : CodeAccessSecurityAttribute 
{ 
    public AdministratorPrincipalPermissionAttribute(SecurityAction action) : base(action) 
    { } 

    public override IPermission CreatePermission() 
    { 
     var identifier = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); 
     var role = identifier.Translate(typeof(NTAccount)).Value; 
     return new PrincipalPermission(null, role); 
    } 
} 

이 (GAC, caspol 몇 가지 추가 배포 노력을 필요로주의하세요 기타.).