如何设置多语言PrincipalPermission角色名称?

时间:2009-05-04 14:13:10

标签: c# security permissions multilingual

我正在尝试使用Windows帐户保护WCF服务。该服务应该在许多不同语言的系统上运行。如何设置具有语言无关角色名称的PrincipalPermission?

我发现了像这样的丑陋变通方法。

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

我认为这不是一个好的解决方案,有没有办法使这种语言独立?有没有办法使用帐户SID而不是字符串?

5 个答案:

答案 0 :(得分: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等)。

答案 1 :(得分:2)

再试一次:看看http://msdn.microsoft.com/en-us/library/system.security.principal.windowsbuiltinrole.aspx ....然后转到示例。在那里,您可以使用BuiltIn枚举成员来获取拼写正确的组名(通过API)......然后它应该是语言中立的。

HTH, 托马斯

答案 2 :(得分:1)

您可以使用命令式版本并将语言中性表单(例如SID)动态转换为本地化表单(可以通过SecurityIdentifier.Translate)。

众所周知的SID列于KB 243330中。

答案 3 :(得分:0)

嗯,我不会在我的代码中直接使用组名(硬编码)。尝试将其抽象为“HelloWorldAdmin”之类的角色,并在app.config中配置角色。这个应该映射到用户组。这将允许您的用户/管理员选择一个组并将其映射到该角色(例如,如果应用程序管理员不是您的AD管理员)。 看看http://msdn.microsoft.com/en-us/library/ms998314.aspx。 HTH。

答案 4 :(得分:0)

您是否完全相信在德语系统中,“BUILTIN \ Administrators”将无效?我甚至会想到,这些基本的组名应该是有效的。是的,在您的管理工具中,它将显示“Vordefiniert \ ADministratoren” - 但如果PrincipalPermission属性与语言相关,我会感到惊讶。

MARC