Domanda

Sto cercando di proteggere un servizio WCF utilizzando gli account di Windows. Il servizio dovrebbe essere eseguito su molti sistemi con lingue diverse. Come posso impostare una PrincipalPermission che abbia nomi di ruoli indipendenti dalla lingua?

Ho trovato brutte soluzioni alternative come questa.

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

Non penso che questa sia una buona soluzione, c'è un modo per rendere indipendente questa lingua? Esiste un modo per utilizzare l'account SID anziché una stringa?

È stato utile?

Soluzione

Un altro tentativo: dai un'occhiata a http : //msdn.microsoft.com/en-us/library/system.security.principal.windowsbuiltinrole.aspx .... e vai all'esempio. Lì puoi usare i membri dell'enumerazione BuiltIn per ottenere il nome del gruppo scritto correttamente (tramite l'API) ... quindi dovrebbe essere indipendente dalla lingua.

HTH, Thomas

Altri suggerimenti

È possibile inserire il proprio attributo di autorizzazione che gestisce la traduzione:

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

Si noti che ciò richiederebbe un ulteriore sforzo di distribuzione (gac, caspol ecc.).

È possibile utilizzare la versione imperativa e convertire dinamicamente un modulo indipendente dalla lingua (ad esempio SID) in un formato localizzato (può essere tramite SecurityIdentifier.Translate).

I SID noti sono elencati in KB 243330.

Hmmmm, non userei un nome di gruppo direttamente nel mio codice (hard coded). Prova ad astrarlo in un ruolo come " HelloWorldAdmin " e avere un ruolo configurato in app.config. Questo dovrebbe essere mappato su un gruppo di utenti. Ciò consentirebbe agli utenti / amministratori di selezionare un gruppo e mapparlo al ruolo (ad esempio nel caso in cui gli amministratori dell'applicazione non siano amministratori AD). Dai un'occhiata a http://msdn.microsoft.com/en-us/ biblioteca / ms998314.aspx . HTH.

Sei assolutamente sicuro che su un sistema in lingua tedesca, il " BUILTIN \ Administrators " non funzionerà? Avrei immaginato anche allora, questi nomi di gruppo di base dovrebbero essere validi. Sì, nei tuoi strumenti di amministrazione mostrerà " Vordefiniert \ ADministratoren " - ma sarei sorpreso se l'attributo PrincipalPermission dipendesse dalla lingua.

MARC

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top