2009-05-04 18 views
6

Estoy tratando de asegurar un servicio WCF usando cuentas de Windows. El servicio debería ejecutarse en muchos sistemas con diferentes idiomas. ¿Cómo puedo establecer una PrincipalPermission que tenga nombres de roles independientes del idioma?¿Cómo establecer un nombre de rol PrincipalPermission en varios idiomas?

He encontrado soluciones feas como ésta.

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

No creo que esta sea una buena solución, ¿hay alguna manera de hacer que este lenguaje sea independiente? ¿Hay alguna forma de usar el SID de la cuenta en lugar de una cadena?

Respuesta

0

Hmmmm, yo no usaría un nombre de grupo directamente en mi código (codificado). Intente resumirlo en un rol como "HelloWorldAdmin" y tenga una función configurada en la aplicación.config. Este debe estar asignado a un grupo de usuarios. Esto permitiría a sus usuarios/administradores seleccionar un grupo y asignarlo a la función (por ejemplo, en el caso de que los administradores de la aplicación no sean sus administradores de AD). Eche un vistazo al http://msdn.microsoft.com/en-us/library/ms998314.aspx. HTH.

0

¿Estás absolutamente seguro de que en un sistema de lengua alemana, los "BUILTIN \ Administradores" no va a funcionar? Me hubiera imaginado que incluso entonces, estos nombres de grupos básicos deberían ser válidos. Sí, en sus herramientas de administración, mostrará "Vordefiniert \ ADministratoren", pero me sorprendería que el atributo PrincipalPermission dependa del idioma.

MArc

+1

No, no funciona, la lógica principal está en el método WindowsPrincipal.IsInRole (cadena). Miré con reflector y no encontré ninguna "traducción" de los nombres de los roles. a modo de prueba de su auto: WindowsPrincipal director = new WindowsPrincipal (WindowsIdentity.GetCurrent()); bool english = principal.IsInRole ("Builtin \\ Administradores"); bool german = principal.IsInRole ("Vordefiniert \\ Administratoren"); Yo estaba tan sorprendido como usted es, podría ser que me falta algo ... –

+1

Estoy sorprendido y aturdido ..... sowas deppertes auch! Die Spinnen, die Microsofties :-) –

+0

@marc_s: Estoy de acuerdo, en el pasado, esto también me sorprendió al sincronizar LDAP y escribir instaladores. –

1

Es posible utilizar la versión imperativa y convertir dinámicamente un lenguaje de forma neutra (por ejemplo SID) a la forma localizada (puede ser a través de SecurityIdentifier.Translate).

SID conocidos se enumeran en KB 243330.

3

Se podría rodar su propio atributo permiso que se encarga de la traducción:

[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); 
    } 
} 

Tenga en cuenta que esto requeriría un esfuerzo de despliegue adicional (GAC, caspol etc.).

Cuestiones relacionadas