Hai bisogno di due tenere concetti a parte:
AUTENTICAZIONE è il processo di determinare chi è che si sta chiamando, e assicurandosi che sia veramente chi sostiene di essere; questo può essere fatto utilizzando username/password, le credenziali di Windows (che era già autenticato la sua scatola di Windows attraverso la registrazione on), o richiedendo al chiamante di avere alcune informazioni (certificato)
AUTORIZZAZIONE è il processo - una volta che si sai che vi chiama, per determinare che cosa chiamante può fare (o quello che non può fare)
per poter utilizzare gruppi di Active Directory, è necessario utilizzare una modalità di protezione in WCF che supporti Credenziali di Windows. Il più semplice è usare le credenziali di Windows dall'inizio, che è l'impostazione predefinita per wsHttpBinding e netTcpBinding - in questo caso, il chiamante passerà sempre le sue credenziali di Windows ad ogni chiamata, e potrai controllare quelle sul lato server guardando il ServiceSecurityContext.Current.WindowsIdentity
:
WindowsIdentity caller = ServiceSecurityContext.Current.WindowsIdentity;
Questo metodo funziona bene in uno scenario Intranet - ognuno è dietro un firewall aziendale e autenticato sulle loro macchine in ogni caso. Per abilitare questo, basta usare wsHttp o netTcp binding (io raccomanderei netTcp in questo caso).
L'altro caso leggermente più complicato è quando il client presenta un certificato X.509 e quindi lo si mappa sul lato server a un utente AD esistente nella rete. Questo è piuttosto avanzato, tuttavia.
Una volta che il chiamante è autenticato, ad es. sai chi sta chiamando, puoi usare il normale modello di sicurezza basato sui ruoli per limitare i privilegi. È sufficiente aggiungere gli attributi [PrincipalPermission(....)]
ai metodi che si desidera proteggere e, se l'utente non soddisfa nessuno di questi requisiti, verrà generata un'eccezione di sicurezza e il metodo non verrà eseguito.
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
[PrincipalPermission(SecurityAction.Demand, Name = "JohnDoe")]
public string SayHello(string caller)
{
......
}
è possibile avere più di quelli "PrincipalPermission" gli attributi, e sono abbinati insieme in un "OR" moda - se uno di essi corrisponde il chiamante corrente, che sarà lui a essere consentito di fare il chiamata.
Consultare la pagina 4 di questo articolo Fundamentals of WCF Security per ulteriori dettagli su come utilizzare la sicurezza basata sui ruoli.
Marc
fonte
2009-08-26 05:22:34
Grazie arc, lasciami provare la soluzione proposta. Molte grazie ancora. –
Questo è fantastico, grazie. Mi ha risolto un sacco di lavoro Come si cattura la SecurityException che viene lanciata, comunque? Sembra essere lanciato prima che il metodo venga chiamato, ma non viene propagato al callstack ... – trendl
Viene lanciato al client - il client deve occuparsene. –