2013-07-15 16 views
15

Ho un'applicazione Web API e ho capito che OAuth sarebbe il modello di sicurezza standard per le API in cui un server di autenticazione sarebbe responsabile della generazione di token di autorizzazione in modo che l'utente possa inviare al nostro server e consumare i servizi.Come iniziare con OAuth per proteggere un'applicazione API Web?

Sono molto nuovo a questo ma capisco i ruoli coinvolti:

  • Resource Proprietario
  • client
  • Server Resource
  • Autorizzazione Server

Ma ciò che è OAuth esattamente nella pratica, non in teoria? È una libreria .NET? È un servizio fornito da una società separata? È qualcosa che posso configurare sul mio computer di sviluppo locale e vedere come funziona?

Come iniziare con OAuth per proteggere un'applicazione API Web?

risposta

17

OAuth è un protocollo; la versione corrente è OAuth 2.0. Più alla tua domanda, quel link elenca diverse implementazioni del protocollo in varie tecnologie. Per l'utilizzo con .NET Web API probabilmente sei interessato a DotNetOpenAuth che fornisce implementazioni di OAuth 1 e OAuth 2.

Uso DotNetOpenAuth in un'app a cui sto lavorando ora per proteggere un Web .NET. API. Ho un OAuth2Handler che estende DelegatingHandler che viene inserito nella pipeline dell'API Web prima che le richieste in arrivo raggiungano qualsiasi controller. OAuth2Handler fa il seguente:

  1. un'istanza di un DotNetOpenAuth ResourceServer
  2. chiede ResourceServer.GetPrincipal() che legge e decodifica l'accesso per memoria (rilasciato altrove dalla AuthorizationServer e restituisce un OAuthPrincipal (Nel mio caso sto leggendo dati aggiuntivi che l'implementazione DotNetOpenAuth consente di passare e creare un ClaimsPrincipal.)
  3. Assegnazione dello IPrincipal contenente le informazioni utente lette dal token di accesso alla proprietà User del thread e il contesto HTTP corrente quindi è a disposizione dalla proprietà ApiController.User nei controllori di servizio: httpContext.User = Thread.CurrentPrincipal = principal;

Onestamente, ottenendo tutto questo lavoro (per esempio la configurazione del server di autorizzazione, del server delle risorse, dei certificati, ecc.) non è banale. Sfortunatamente non sembra che ci sia una buona guida sul sito DotNetOpenAuth. Ecco alcuni altri compiti che dovrete davanti a voi se seguire questa strada:

  • Implementare IAuthorizationServer - Questa è l'interfaccia fornita da DotNetOpenAuth che permette di collegare in biblioteca e utilizzare loro implementazione per rilasciare token di accesso OAuth2. Avrai anche bisogno di implementare INonceStore e ICryptoKeyStore che ho fatto utilizzando un contesto EntityFramework per l'archiviazione.
  • Configura certificati - Il AuthorizationServer e ResourceServer utilizzano ciascuno dei certificati per crittografare/decrittografare il token di accesso assicurandosi che siano accessibili l'uno con l'altro. Ho creato un po 'di custom configuration così ho potuto gestire questa configurazione nei file web.config della mia app del server di autorizzazione e dei miei servizi API Web (server delle risorse).
  • Gestisci token di aggiornamento - Quando si richiede per la prima volta un token di accesso dal server di autorizzazione, si torna indietro (a seconda della configurazione) sia un token di aggiornamento OAuth2 che un token di accesso. I servizi utilizzano il token di accesso che dovrebbe essere di breve durata. Il token di aggiornamento viene utilizzato per ottenere più token di accesso. Il token di aggiornamento dovrebbe essere tenuto segreto (qualunque cosa ciò significhi nel tuo scenario). Per me significa che il token di aggiornamento non è mai esposto a javascript sul lato client nella mia app web.

Spero che questo ti aiuti ad avere un'idea di alto livello su come iniziare con OAuth e .NET Web API. Ecco a blog post dimostrando alcuni di questi passaggi. This SO answer fornisce alcuni dettagli di alto livello sul lato client dell'immagine.

(I documenti online di DotNetOpenAuth sembrano non essere disponibili in questo momento ... scusate se non vi sono collegamenti a essi; a quanto pare ha happened before).

+0

Ogni possibilità di condividere qualche codice sorgente. Ho giocato con questo per un paio d'ore ed è un po 'un PITA. I documenti DotNetOpenAuth non sono stati di grande aiuto in questa particolare istanza. –

Problemi correlati