2013-04-08 15 views
9

Stavo cercando di implementare una named pipe per le comunicazioni service/client in .NET e ho trovato this code che, durante l'inizializzazione del lato server della pipe, doveva impostare un descrittore di sicurezza per la pipe. Lo hanno fatto in questo modo:Localizzazione per identità di sicurezza in .NET

PipeSecurity pipeSecurity = new PipeSecurity(); 

// Allow Everyone read and write access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule("Authenticated Users", 
    PipeAccessRights.ReadWrite, AccessControlType.Allow)); 

// Allow the Administrators group full access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule("Administrators", 
    PipeAccessRights.FullControl, AccessControlType.Allow)); 

Ma sto guardando, e io sono preoccupato per specificare SID come stringhe o Authenticated Users e Administrators parti. Qual è la garanzia che verranno chiamati, per esempio, in cinese o in un'altra lingua?

+0

OK. L'ho confermato anch'io. Sembra funzionare. – ahmd0

+5

Dovresti considerare di suddividere questo in una coppia domanda/risposta corretta. – slugster

+0

Sì, è possibile rispondere alla propria domanda. – DWright

risposta

0

(Estratto dal domanda iniziale di OP)

sono arrivato fino a questa alternativa:

PipeSecurity pipeSecurity = new PipeSecurity(); 

// Allow Everyone read and write access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule(
    "Authenticated Users", 
    new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null), 
    PipeAccessRights.ReadWrite, AccessControlType.Allow)); 

// Allow the Administrators group full access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule(
    "Administrators", 
    new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null), 
    PipeAccessRights.FullControl, AccessControlType.Allow)); 
+0

Questo non funziona per me, non c'è sovraccarico che prende la stringa e il 'SecurityIdentifier', [vedi qui] (https://msdn.microsoft.com/en-us/library/system.io.pipes. pipeaccessrule.pipeaccessrule (v = vs.110) .aspx). Rimuovi i letterali stringa "Utenti autenticati" e "Amministratori" '. – doug65536

2

È possibile utilizzare WellKnownSidType enum per ottenere sid e tradurre in IdentityReference:

 var sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 
     var everyone = sid.Translate(typeof(NTAccount)); 
     security.AddAccessRule(new PipeAccessRule(everyone, PipeAccessRights.ReadWrite, AccessControlType.Allow)); 
+1

"Tutti" non è una grande idea. Probabilmente vuoi almeno "WellKnownSidType.AuthenticatedUserSid'. C'è un motivo particolare per cui si usa 'WorldSid' (Everyone) diverso dalla paranoia che potrebbe non funzionare? – doug65536

+0

Esattamente! Cambiato. –

+1

Ognuno è una buona idea quando si verificano problemi di sicurezza sconosciuti, usarlo consente di superare un test di integrità per assicurarsi che il codice funzioni, dopo di che è possibile limitare il livello di sicurezza effettivamente necessario. – TheLegendaryCopyCoder

Problemi correlati