2011-08-26 34 views
7

Sto costruendo un'API REST in asp.net mvc. Il mio sistema utilizza l'autenticazione dei moduli. Nome utente/password o openId/fbconnect, ecc. Se ho un attributo [Authorize] su un'azione, in che modo un'app Android o un'app desktop possono accedere al metodo?Autenticazione con API REST

Oppure la domanda migliore è: come dovrei progettare l'applicazione desktop per l'autenticazione? Dovrei passare una chiave API o qualche token di qualche tipo? O l'app desktop si comporterebbe come un browser e utilizzerà i cookie interni? Non sono abbastanza sicuro di come un'API RESTful possa funzionare al di fuori di un browser Web con autenticazione.

risposta

14

Non utilizzerei i cookie in un'API REST. FormsAuthentication è un metodo basato su cookie. Il chiamante deve invece fornire credenziali di autenticazione con ogni richiesta in un'intestazione o come parametro di richiesta.

Ad esempio, è possibile utilizzare l'autenticazione di base per trasmettere nome utente e password oppure aggiungere un'intestazione di autenticazione personalizzata con un token di accesso crittografato (che non è molto RESTful). È inoltre possibile implementare OAuth, in cui il richiedente fornirà un token di accesso con ogni richiesta.

Scriverò un codice personalizzato AuthorizeAttribute per eseguire l'autenticazione nel codice, che offre molto controllo. In alternativa, è possibile utilizzare una classe di base del controller e sovrascrivere il metodo OnAuthorization.

L'API non deve fornire una verifica della password: in un'applicazione Web, una richiesta non autorizzata in genere reindirizza l'utente a una pagina di accesso. In un'API, la richiesta restituirà semplicemente un codice di errore. Ora è compito dell'applicazione client sfidare l'utente attraverso una finestra di dialogo, se applicabile. In un'app mobile, potresti voler mostrare una finestra di dialogo. In un'applicazione Web con OAuth, è probabile che si desideri reindirizzare a un server di autenticazione.

Se si desidera testare l'API REST, suggerisco di utilizzare REST Console for Google Chrome e cURL. Il primo è più facile per i principianti e viene fornito con una bella GUI mentre cURL offre ancora più fedeltà e molti protocolli.

EDIT

Una nota un po 'pedante: Alcune API, anche quelli di abbastanza grandi provider, per esempio Twitter, restituire codici di stato 401 di volta in volta, in genere omettendo l'intestazione (obbligatoria) WWW-Authenticate perché non era sua intenzione sfidare il client.

+0

+1 per la console REST per Google Chrome, menzione :) Bello! –

+1

'Non userei i cookie in un'API REST' - D'accordo, tuttavia, potresti usarlo per generare un token sicuro come in [questa risposta] (http://stackoverflow.com/questions/840537/generating-cryptographically- secure-autenticazione-gettoni # 858.724). – James

+0

@James: questo è un ottimo punto. È sicuramente meglio usare un token invece di inviare nome utente e password in continuazione, perché è più semplice isolare il codice di caldaia in quel modo. – mnemosyn

1

Dai un'occhiata allo schema di autenticazione AWS di Amazons. Fa ciò che molti vogliono, e usa l'intestazione di autorizzazione HTTP standard.