【问题标题】:How to set a multilanguage PrincipalPermission role name?如何设置多语言 PrincipalPermission 角色名称?
【发布时间】:2010-10-23 15:31:22
【问题描述】:

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

我发现了像这样的丑陋解决方法。

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

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

【问题讨论】:

    标签: c# security permissions multilingual


    【解决方案1】:

    您可以滚动自己的权限属性来处理翻译:

     [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 等)。

    【讨论】:

      【解决方案2】:

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

      HTH, 托马斯

      【讨论】:

        【解决方案3】:

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

        KB 243330 中列出了众所周知的 SID。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            您确定在德语系统上“BUILTIN\Administrators”不起作用吗?即使在那时我也会想象,这些基本组名应该是有效的。是的,在您的管理工具中,它会显示“Vordefiniert\ADministratoren” - 但如果 PrincipalPermission 属性取决于语言,我会感到惊讶。

            马克

            【讨论】:

            • 不,它不起作用,主要逻辑在 WindowsPrincipal.IsInRole(string) 方法中。我用反射器查看并没有找到角色名称的任何“翻译”。自己试试吧:WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool 英语 = principal.IsInRole("Builtin\\Administrators"); bool German = principal.IsInRole("Vordefiniert\\Administratoren");我和你一样惊讶,可能是我错过了什么......
            • 我很惊讶和震惊..... sowas deppertes auch!死 Spinnen,死微软 :-)
            • @marc_s:同意,在过去,这也引起了我的注意——在同步 LDAP 和编写安装程序时。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-10
            • 2012-04-29
            • 2010-09-15
            • 1970-01-01
            相关资源
            最近更新 更多