Como definir um PrincipalPermission nome da função de vários idiomas?
-
03-07-2019 - |
Pergunta
Eu estou tentando garantir um serviço WCF usando contas do Windows. O serviço deve ser executado em vários sistemas com diferentes idiomas. Como posso definir um PrincipalPermission que tem linguagem nomes de função independente?
Eu encontrei soluções feias como este.
[PrincipalPermission(SecurityAction.Demand, Role = "Builtin\\Administrators")] // English
[PrincipalPermission(SecurityAction.Demand, Role = "Vordefiniert\\Administratoren")] // German
public string HelloWorld()
{
return "Hello";
}
Eu não acho que isso é uma boa solução, há alguma maneira de fazer este independente idioma? Existe uma maneira de usar o SID da conta em vez de uma string?
Solução
Mais uma tentativa: Tenha uma olhada http : //msdn.microsoft.com/en-us/library/system.security.principal.windowsbuiltinrole.aspx .... e ir para a amostra. Lá você pode usar os membros de enumeração BuiltIn para obter o nome do grupo escrito corretamente (via API) ... então deve ser uma linguagem neutra.
HTH, Thomas
Outras dicas
Você pode rolar o seu próprio atributo permissão que lida com a tradução:
[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);
}
}
Por favor note que isso exigiria algum esforço implantação adicional (GAC, caspol etc.).
Você pode usar a versão imperativo e dinamicamente converter uma forma neutra linguagem (por exemplo SID) para a forma localizada (pode ser através SecurityIdentifier.Translate).
SIDs bem conhecidos estão listados no KB 243330.
Hmmmm, eu não iria usar um nome de grupo diretamente no meu código (codificado). Tente abstrair-lo para um papel como "HelloWorldAdmin" e têm um papel configurado no app.config. Este deve ser mapeado para um grupo de utilizadores. Isso permitiria que os usuários / administradores para selecionar um grupo e mapeá-lo para o papel (por exemplo, no caso de que os administradores de aplicação não está AD admins). Ter um olhar para http://msdn.microsoft.com/en-us/ biblioteca / ms998314.aspx . HTH.
Você tem certeza absoluta de que em um sistema de língua alemã, o "BUILTIN \ Administradores" não vai funcionar? Eu teria imaginado, mesmo assim, esses nomes básicos do grupo devem ser válidos. Sim, em suas ferramentas de administração, ele irá mostrar "Vordefiniert \ ADministratoren" - mas eu ficaria surpreso se o atributo PrincipalPermission seria dependente de idioma
.MArc