2009-05-04 28 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」); 我和你一樣驚訝,可能是我失去了一些東西...... – 2009-05-05 06:44:08

1

你可以使用勢在必行版本和動態地轉換語言中性形式(例如,SID)的局部形式(可能是通過SecurityIdentifier.Translate)。

衆所周知的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等等。)。