2009-08-25 18 views
5

Ho un servizio Web WCF che viene utilizzato da un'applicazione client C# e ho anche 4 gruppi memorizzati in Active Directory. L'applicazione client deve connettere questo servizio Web passando le credenziali di accesso.Autenticazione servizio Web WCF basata su gruppi di annunci

Requisito:

  1. Limitare funzionalità del servizio web basato su gruppo di credenziali utente di Windows memorizzate in AD (Active Directory)
  2. passare le credenziali specifico utente dal l'applicazione client a questo servizio web

Domanda:

Come autenticare o convalidare l'utente che ha effettuato l'accesso al collegamento a questo servizio Web, che gestisce l'evento La funzione r verrà invocata per convalidare le credenziali dell'utente registrate.

Se qualcuno conosce questo, allora per favore fatemelo sapere

risposta

10

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

+0

Grazie arc, lasciami provare la soluzione proposta. Molte grazie ancora. –

+0

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

+0

Viene lanciato al client - il client deve occuparsene. –