Ho creato un server di autorizzazione OAuth2 utilizzando DotNetOpenAuth, che funziona correttamente: sto utilizzando il flusso della password del proprietario della risorsa e lo scambio delle credenziali dell'utente con un token di accesso.Come autorizzo l'accesso alle risorse di ServiceStack usando i token di accesso OAuth2 tramite DotNetOpenAuth?
Ora desidero utilizzare quel token di accesso per recuperare i dati da endpoint sicuri in un'API ServiceStack e non riesco a capire come farlo. Ho esaminato i fornitori di Facebook, Google, ecc. Inclusi in ServiceStack ma non è chiaro se dovrei seguire lo stesso schema o no.
Quello che sto cercando di realizzare (credo!) È
- OAuth cliente (la mia app) chiede Risorsa ('Catherine Smith') per le credenziali
- client invia la richiesta al server di autorizzazione , riceve un token di accesso
- Cliente richiede una sicura risorsa dal server risorsa (
GET /users/csmith/photos
)- Il token di accesso è incluso in un'intestazione HTTP, per esempio
Authorization: Bearer 1234abcd...
- Il token di accesso è incluso in un'intestazione HTTP, per esempio
- Il server risorsa decodifica il token di accesso per verificare l'identità del titolare risorsa
- Il server risorsa verifica che il proprietario risorsa ha accesso agli elementi risorsa richiesta
- Il server di risorse restituisce risorsa al cliente
punti 1 e 2 stanno lavorando, ma non riesco a capire come integrare il codice del server risorsa DotNetOpenAuth con il framework di autorizzazione ServiceStack.
Esiste un esempio da qualche parte su come ottenerlo? Ho trovato un post StackOverflow simile a How to build secured api using ServiceStack as resource server with OAuth2.0? ma non è una soluzione completa e non sembra utilizzare il modello del provider di autorizzazioni ServiceStack.
MODIFICA: Un po 'più in dettaglio. Ci sono due diverse app Web in gioco qui. Uno è il server di autenticazione/autorizzazione - questo non ospita alcun dato cliente (cioè nessuna API dati), ma espone il metodo/oauth/token che accetterà un nome utente/password e restituirà un token di accesso OAuth2 e un token di aggiornamento, e anche fornisce funzionalità di aggiornamento dei token. Questo è basato su ASP.NET MVC perché è quasi identico all'esempio AuthorizationServer incluso con DotNetOpenAuth. Questo potrebbe essere sostituito in seguito, ma per ora è ASP.NET MVC.
Per l'effettiva API di dati, sto utilizzando ServiceStack perché lo trovo molto meglio di WebAPI o MVC per l'esposizione dei servizi di dati di ReSTful.
Così nel seguente esempio:
il client è un'applicazione desktop in esecuzione sul computer locale di un utente, il server Auth è ASP.NET MVC + DotNetOpenAuth, e il Il server di risorse è ServiceStack
Il particolare frammento di codice DotNetOpenAuth richiesto è:
Quindi, supponendo che sia sulla strada giusta, quello che devo fare è eseguire quel codice da qualche parte nella pipeline di richieste di ServiceStack, per verificare che l'intestazione Autorizzazione nella richiesta API rappresenti un principal valido che ha concesso l'accesso all'ambito richiesto.
sto iniziando a pensare che il posto più logico per attuare questa si trova in un attributo personalizzato che uso per decorare la mia ServiceStack implementazioni del servizio:
using ServiceStack.ServiceInterface;
using SpotAuth.Common.ServiceModel;
namespace SpotAuth.ResourceServer.Services {
[RequireScope("hello")]
public class HelloService : Service {
public object Any(Hello request) {
return new HelloResponse { Result = "Hello, " + request.Name };
}
}
}
Questo approccio permetterà anche specificare il campo di applicazione (s) richiesto per ciascun metodo di servizio. Tuttavia, ciò sembra essere piuttosto contrario al principio "collegabile" dietro OAuth2 e ai ganci di estensibilità integrati nel modello AuthProvider di ServiceStack.
In altre parole - Sono preoccupato che sto sbattendo in un chiodo con una scarpa perché non riesco a trovare un martello ...
Fa [OpenId Auth Provider per ServiceStack] (https://www.nuget.org/packages/ServiceStack.Authentication.OpenId) adatto alle tue esigenze? Ecco la documentazione - [OpenId 2.0 Authentication Support] (https://github.com/ServiceStack/ServiceStack/wiki/OpenId) –
Questo pacchetto potrebbe fornire un utile esempio di codice: [Configurare un backend ServiceStack per accettare token OAuth2 Bearer] (http : //www.nuget.org/packages/Auth10.ServiceStack/) –
Per quanto riguarda l'autorizzazione, la lettura consigliata per i ruoli incorporati e il supporto delle autorizzazioni è disponibile qui: http://stackoverflow.com/questions/12095094/servicestack-web- services-security/12096813 # 12096813 ed ecco un esempio più completo di aggiunta di un provider OAuth personalizzato rispetto a quello che hai collegato: http://davetimmins.wordpress.com/2013/04/12/using-oauth-with-arcgis-online -e-servicestack/- hai ragione. Non vedo alcun esempio che integri completamente i due, l'autenticazione OAuth insieme all'autorizzazione dei ruoli e delle autorizzazioni. –