2009-12-07 18 views
5

Sto creando un sito Web che conterrà entrambe le pagine ASP.NET e un'applet Flash. Voglio incapsulare la mia logica aziendale in un servizio WCF che verrà esposto attraverso due endpoint: uno accessibile su Internet tramite HTTP (S), per l'utilizzo da parte del client Flash e uno accessibile all'interno del data center per l'utilizzo da parte dei server delle applicazioni . Se questo non sembra un buon approccio, allora fermati qui; altrimenti, andrò avanti ...Autenticazione basata su token in WCF

La domanda è come autenticare le richieste provenienti dal client Flash. Poiché non desidero memorizzare la password dell'utente in un cookie del browser, non voglio inviare la password ad ogni richiesta e non voglio dover utilizzare HTTPS dopo l'accesso iniziale, prevedo di utilizzare un token- sistema di autenticazione basato. Inoltre, non desidero che l'utente debba accedere al client Flash dopo aver effettuato l'accesso al sito stesso, quindi ho intenzione di utilizzare Javascript per passare il token al client Flash all'avvio.

So che WCF supporta l'uso del framework di sicurezza incorporato di .NET Framework (System.Security) per imporre il controllo degli accessi e vorrei approfittarne.

La domanda, quindi, è: Come si passa il token al servizio WCF quando viene chiamato da Flash e come si elabora il token sul server?

  • WCF dispone di una modalità di autenticazione "rilasciato gettone", ma sembra questo è destinato ad essere utilizzato in uno scenario di vera e propria federazione con un Token servizio sicuro e SAML gettoni - un po 'più di complessità che ho davvero volere. È possibile utilizzare questa modalità con i miei token "semplici stringhe casuali"? Se é cosi, come? Tieni presente che questo deve essere compatibile con Flash.
  • Potrei potenzialmente passare il token in un'intestazione (un'intestazione SOAP o un'intestazione HTTP). In questo caso, una volta determinato quale utente sta effettuando la richiesta, come posso informare il framework in modo che i controlli System.Security funzionino?
  • Esiste un approccio diverso che dovrei considerare? Tutto ciò che evita l'invio di password in ogni richiesta, mi consente di utilizzare System.Security e funziona con Flash è una possibilità.
+0

Aaron, hai mai trovato un modo semplice per farlo? Sto cercando di fare una semplice autenticazione basata su token in WCF e sembra molto più difficile di quanto dovrebbe. – technophile

+0

Alla fine ho finito per girare il mio.Ho un endpoint WCF che emette i token - richiede un nome utente e una password, li verifica e risponde con il token, che nel mio caso è semplicemente una stringa casuale. I metodi di business logic effettivi si trovano su un endpoint diverso, che ha un'ispettore di messaggi personalizzati che legge un'intestazione personalizzata contenente il token. Sul client, un'altra finestra di ispezione dei messaggi aggiunge l'intestazione ai messaggi in uscita. È più lavoro di quanto avrei voluto fare, ma sembra funzionare bene. – Aaron

risposta

2

A quanto pare la domanda iniziale è stata risolta Terrò questa breve, ma un approccio sarebbe davvero di passare il token di autenticazione in un'intestazione HTTP e sovrascrivere CheckAccess(OperationContext operationContext, ref Message message) in un costume ServiceAuthorizationManager.

In precedenza il servizio è stato configurato per utilizzare un criterio personalizzato che implementa IAuthorizationPolicy.

Non resta che implementare semplici classi IIdentity e IPrincipal per memorizzare lo stato di autorizzazione.

Un certo numero di buoni articoli esiste su questo argomento:

http://msdn.microsoft.com/en-us/library/system.identitymodel.policy.iauthorizationpolicy.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthorizationmanager.aspx

Credo che questo può ancora sentire come una soluzione di "roll-your-own", ma la sua almeno rassicurante quando segui uno schema stabilito. Ha il vantaggio di mettere nero il tuo codice di autorizzazione dai tuoi metodi di servizio.

Problemi correlati