6

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

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

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

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

4

5 回答 5

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

于 2009-05-09T13:29:14.917 回答
2

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

HTH,托马斯

于 2009-05-08T11:26:44.177 回答
1

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

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

于 2009-05-08T18:40:47.293 回答
0

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

于 2009-05-04T14:49:50.197 回答
0

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

马克

于 2009-05-04T16:44:47.863 回答