Progettazione dell'autenticazione per l'API REST

11

Sto lavorando su un'API per un servizio REST che sto per produrre e consumare. Ho passato gli ultimi giorni a cercare di capire come gestire bene l'autenticazione, e penso di aver finalmente trovato qualcosa.

Sto arrivando a questo in base ai seguenti fatti sullo stack di applicazioni:

  1. Client & I server sono in .NET4 (parte client nel profilo client)
  2. Il server espone usando WCF REST
  3. Veramente non voglio mantenere il nome utente e la password in memoria nell'app

Da 3, volevo utilizzare una forma di autenticazione token, in modo che dopo che le credenziali sono state verificate dal server, il client recupera un token da utilizzare nel resto dell'app (questo mi permetterà di fare altre cose , come il time-out degli utenti, essere in grado di spostare gli utenti senza problemi tra le versioni web e desktop, ecc.). Dopo aver scoperto come rendere le chiamate replay e resistenti alle manomissioni, ho trovato il seguente:

  1. Prima che il client tenti di autenticare, genera una coppia di chiavi Diffie-Hellman utilizzando la classe ECDiffieHellmanCng .
  2. Invia la parte pubblica della coppia di chiavi sul filo insieme al nome utente e alla password (Over HTTPS ovviamente).
  3. Il server autentica la combinazione nome utente / password, se ha esito positivo, quindi effettua le seguenti operazioni:
    1. Crea un token di sessione univoco
    2. Genera la propria coppia di chiavi DH e calcola il segreto condiviso dalla chiave pubblica fornita dal client
    3. Prende nota del token di sessione, del segreto condiviso, dell'utente e dell'ora "ultima azione" (utilizzata per una finestra di scadenza a rotazione) nel suo database
    4. Restituisce il token di sessione, la sua chiave DH pubblica e un messaggio di successo dell'autenticazione
  4. Il cliente prende la chiave DH dalla risposta, calcola il segreto condiviso e memorizza entrambi i token e i segreti nella memoria.

Da questo momento in poi, la combinazione di token / segreto di sessione funziona come la maggior parte delle altre API REST, con la richiesta di impronte digitali e timestamp, e quindi di generare una sorta di HMAC generato. Ogni volta che un client esegue un'azione contro il server, controlla la coppia token / secret e autorizza l'azione se è valida e non è scaduta e aggiorna l'ultimo record di azione nella sessione.

Non vedo difetti evidenti, ed è probabilmente troppo ingegnerizzato per questo, ma ho bisogno di imparare come farlo a un certo punto. L'HMAC previene gli attacchi di replay, la negoziazione del DH aiuta a prevenire gli attacchi del MITM (non riesco a pensare ad un attacco praticabile dalla parte superiore della mia testa tra HMAC / DH).

Qualche buco in cui qualcuno può colpire?

    
posta Matt Sieker 14.07.2011 - 23:35
fonte

2 risposte

5

Piuttosto che inventare il tuo, dovresti prendere in considerazione la lettura dell'API OpenAM e prenderlo a prestito.

link

Il Wiki di OpenAM è particolarmente utile

link

Non è necessario utilizzare i loro componenti. Ma se usi la loro API, scoprirai che la tua vita sarà più semplice a lungo termine.

    
risposta data 15.07.2011 - 00:03
fonte
2

Sono d'accordo al 100% con @ S.Lott che non vuoi fare da solo. Suggerisco di guardare un'altra alternativa: il servizio di controllo degli accessi di Windows Azure (ACS). ACS costa denaro, ma è molto economico (10.000 transazioni per $ 0,01) e viene gestita una buona quantità di infrastrutture. WIF è sfruttato sul client.

Questa è anche una soluzione basata su standard / attestazioni - che è di gran moda. Dai un'occhiata a questo articolo sull'utilizzo di WCF e REST e ACS insieme .

Se stai pensando al futuro, questo è anche un meccanismo che può crescere con te, dato che hai app mobili al di fuori del firewall, partner e così via. Anche se non vuoi usarlo dal momento che aggiunge una dipendenza al di fuori del tuo firewall, potresti voler controllare le idee. Molto lucido

Buona fortuna! -Bill

    
risposta data 19.02.2012 - 05:03
fonte

Leggi altre domande sui tag