2009-05-04 6 views
6

J'essaie de sécuriser un service WCF en utilisant des comptes Windows. Le service devrait fonctionner sur de nombreux systèmes avec des langues différentes. Comment puis-je définir une PrincipalPermission avec des noms de rôles indépendants de la langue?Comment définir un nom de rôle PrincipalPermission multilingue?

J'ai trouvé des solutions de contournement moche comme celui-ci. Je ne pense pas que ce soit une bonne solution, est-il possible de rendre ce langage indépendant? Est-il possible d'utiliser le compte SID au lieu d'une chaîne?

Répondre

0

Hmmmm, je n'utiliserais pas un nom de groupe directement dans mon code (codé en dur). Essayez de l'extraire à un rôle tel que "HelloWorldAdmin" et d'avoir un rôle configuré dans app.config. Celui-ci devrait être mappé à un groupe d'utilisateurs. Cela permettrait à vos utilisateurs/administrateurs de sélectionner un groupe et de le mapper au rôle (par exemple, dans le cas où les administrateurs de l'application ne sont pas vos administrateurs AD). Regardez le http://msdn.microsoft.com/en-us/library/ms998314.aspx. HTH.

0

Etes-vous absolument sûr que sur un système de langue allemande, le "BUILTIN \ Administrators" ne fonctionnera pas? J'aurais imaginé même alors, ces noms de groupe de base devraient être valides. Oui, dans vos outils d'administration, il affichera "Vordefiniert \ ADministratoren" - mais je serais surpris si l'attribut PrincipalPermission dépend de la langue.

MArc

+1

Non cela ne fonctionne pas, la logique principale est dans la méthode WindowsPrincipal.IsInRole (chaîne). J'ai regardé avec un réflecteur et n'ai trouvé aucune "traduction" des noms de rôle. essayez-le vous-même: WindowsPrincipal principal = new WindowsPrincipal (WindowsIdentity.GetCurrent()); bool anglais = principal.IsInRole ("Builtin \\ Administrators"); bool german = principal.IsInRole ("Vordefiniert \\ Administratoren"); J'étais aussi surpris que vous l'êtes, peut-être qu'il me manque quelque chose ... –

+1

Je suis étonné et abasourdi ..... sowas deppertes auch! Die Spinnen, die Microsofties :-) –

+0

@marc_s: D'accord, dans le passé, cela m'a également surpris - lors de la synchronisation LDAP et l'écriture des installateurs. –

1

Vous pouvez utiliser la version impérative et convertir dynamiquement une forme neutre de la langue (par exemple SID) à la forme localisée (peut être par SecurityIdentifier.Translate).

SIDs bien connus sont répertoriés dans KB 243330.

3

Vous pouvez rouler votre propre attribut d'autorisation qui gère la traduction:

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

S'il vous plaît noter que cela nécessiterait un effort de déploiement supplémentaire (gac, caspol etc.).

Questions connexes