Supponiamo di avere alcune API RESTful le cui risorse esposte vogliamo esporre. Gli utenti finali lavoreranno con questa API attraverso applicazioni client come app mobili e client basati su Javascript che girano su browser web.Come verificare quali risorse possono accedere a ciascun utente con OAuth e OpenID Connect?
Con OAuth 2.0 questa API RESTful giace sul Resource Server e avremo un server di autorizzazione sul quale sono registrate le applicazioni client. Gli utenti saranno quindi registrati sul server di autorizzazione e potranno concedere l'autorizzazione a tali applicazioni per accedere alle risorse per loro conto o meno.
Pertanto, quando l'utente accede a un'applicazione client, verrà reindirizzato al server di autorizzazione e verrà richiesto di concedere le autorizzazioni a detta app client. Successivamente viene emesso un token di accesso e il client è in grado di effettuare richieste al server di risorse.
Tutto questo è abbastanza chiaro per me. C'è solo un pezzo mancante: la protezione di ogni risorsa potrebbe dipendere dall'utente. Per essere più precisi potrebbe essere dipendente dalle richieste. Quello che voglio dire con questo è che possiamo avere la seguente situazione:
La risorsa http://resourceserver.com/api/first-resource dovrebbe essere accessibile agli utenti con claim "ExampleClaim" solo con il valore di 123.
La risorsa http://resourceserver.com/api/second-resource dovrebbe essere accessibile solo agli utenti con rivendicazione "AnotherClaim" con valore 123.
La risorsa http://resourceserver.com/api/third-resource deve essere accessibile a tutti gli utenti.
Quando ho sentito parlare di OAuth che fare con ASP.NET WebAPI e ho affrontato che nel seguente modo: quando la richiesta è stata inviata con l'intestazione Authorization: Bearer [token]
, sul lato server principale thread è stato impostato e io pensavo che questo significasse che l'utente era autenticato con l'API. Quindi ho usato gli attributi [Authorize]
per verificare se l'utente potesse accedere alla risorsa.
Dopo aver studiato OAuth più profondamente, ho visto che si trattava di un terribile abuso del protocollo. Come ho appreso, OAuth autorizza le applicazioni e non gli utenti. Quando ho effettuato la richiesta con l'intestazione Autorizzazione, come ho appreso, il token di accesso non dovrebbe contenere informazioni sull'utente, solo sull'applicazione che può fare la richiesta.
Considerando che, l'invio dell'intestazione Autorizzazione con la richiesta non identifica l'utente e non dice se l'utente può o non può accedere a detta risorsa.
In tal caso, come si esegue questo tipo di autorizzazione? Voglio dire, non l'autorizzazione dell'app client che esegue la richiesta, ma l'autorizzazione dell'utente che accede alla risorsa in base alle sue affermazioni? Credo che sia qui che entra OpenID Connect e sono i token ID, ma non sono sicuro. Come si gestisce questo?
Grazie ancora per l'aiuto @TakahikoKawasaki. Penso di averlo capito ora. Alla fine utilizziamo il token di accesso OAuth per avere il controllo di accesso contro le applicazioni client: quale client può accedere a quale risorsa. Quindi dal token di identità OpenID Connect abbiamo il controllo dell'accesso agli utenti: selezioniamo il reclamo soggetto dal token ID che identifica gli utenti e guarda il database se l'utente ha le richieste richieste per accedere alla risorsa. Alla fine, invece di spostare le attestazioni in giro, spostiamo il soggetto all'interno del token di identità e verifichiamo le richieste necessarie all'autorizzazione. È così? – user1620696
Modificato la risposta per il tuo commento. –
Grazie per la risposta dettagliata @TakahikoKawasaki. Solo un punto, hai detto nel passaggio 4 "OAuth 2.0 NON è per questo" e lo capisco, poiché l'obiettivo di OAuth è il controllo dell'accesso contro le applicazioni client. Quindi c'è qualcosa di sbagliato nell'estrarre l'argomento dal token di accesso in questo modo e verificare le affermazioni? O questo è il modo giusto di fare le cose? Ci scusiamo per tanti dubbi, non sono davvero un esperto in sicurezza e sto solo iniziando con OAuth e OpenID Connect. – user1620696