Questo articolo si era perso nelle bozze da diverso tempo. Complice il periodo pasquale, ho deciso di rimetterci mano e pubblicarlo. Tratta temi legati all’autenticazione e autorizzazione, che sono tuttora validi.
Il primo passo è quello di definire che cos’è un token. Se vogliamo accedere ad una risorsa protetta, il primo passo è quello di richiedere un token. Parlando di sicurezza basata su toke, molto spesso stiamo parlando di JWT o ti token web Json. Senza entrare nei dettagli, possiamo considerarlo come un oggetto Json che viene utilizzato per lo scambio sicuro dei dati.
Flusso per lo scambio dei dati tramite token
I passaggi per ottenere un token sono:
- un utente fornisce le credenziali al server di autorizzazione e il server risponde con un token
- l’ utente utilizzerà il token per interagire con l’API e recuperare i dati richiesti. Naturalmente, dietro le quinte, l’API convaliderà il token e deciderà se l’utente ha accesso o meno all’endpoint richiesto
- l’utente può utilizzare il token con un applicazione di terze parti che comunica con l’API e recupera i dati. Naturalmente, un’applicazione di terze parti deve fornire un token all’API tramite headers . Dopo la convalida del token, l’API fornisce i dati all’applicazione client che restituisce i dati a un utente
Fondamentale nel flusso è l’utilizzo del token: una volta ottenuto, non vengono piu’ utilizzate le credenziali!
OAuth2 e OpenID Connect
OAuth2 e OpenId Connect sono protocolli che ci consentono di creare applicazioni sicure.
OAuth2 è il protocollo standard per l’autorizzazione. Delega l’autenticazione dell’utente al servizio che ospita l’account dell’utente e autorizza le applicazioni di terzi ad accedere a tale account. Fornisce flussi diversi per le applicazioni, siano esse applicazioni web o applicazioni desktop o mobili. OAuth è l’acronimo di Open standard for Authorization. Le specifiche di OAuth2 sono definite a partire dall’ RFC RFC 6749, all’interno della quale vengono anche definiti gli endpoint che devono essere implementati/utilizzati.
Con l’autorizzazione viene garantito l’accesso ad un particolare sistema. Ma se vogliamo aggiungere lo strato di autenticazione, è necessario inserire un ulteriore strato: Open Id Connect. Il ruolo di OpenID Connect è proprio quello di integrare OAuth2 con la parte di autenticazione. Avevo già introdotto OpenId Connect in un post precedente.
Endpoint e flussi OAuth2 e OpenID
E’ possibile implementare differenti flussi di accesso, ciascuno con caratteristiche differenti. La descrizione dei flussi è riportata all’interno dell’ RFC 6749. I flussi che possono essere utilizzati sono : Implicit, Authorization Code, Resource Owner Password Credentials, Client Credentials, Hybrid.
Il flusso consente di definire le modalità con cui il token verrà emesso
Non è l’obiettivo di questo post quello di descrivere i singoli flussi.
Gli endpoint che possono utilizati con OAuth2 sono:
/token
– un client utilizza questo endpoint per scambiare una concessione di autorizzazione con un token di accesso. Questo endpoint viene utilizzato anche per le azioni di aggiornamento del token/authorize
– un client utilizza questo endpoint (endpoint di autorizzazione) per ottenere l’autorizzazione dal proprietario della risorsa. Possiamo utilizzare diversi flussi per ottenere l’autorizzazione e ottenere l’accesso all’API/revocation
– questo endpoint abilita l’azione di revoca del token
Aggiungendo Open Id Connect, vengono aggiunti i seguenti endpoint:
/userinfo
– recupera le informazioni sul profilo dell’utente finale/checksession
– controlla la sessione dell’utente corrente/endsession
– termina la sessione per l’utente corrente- …
Identity Server 4
Identity Server 4 è un progetto open source che consente di implementare OAuth2 e Open Id Connect all’interno di applicazioni .NET .
In questo post era già stato introdotto Identity Server 4.
A questo link è possibile scaricare un esempio di applicazione .NET CORE 3.1 che utilizza Identity Server4.
A questo link è possibile scaricare un link di applicazione .NET CORE 3.1 che utilizza Identity Server 4 e token JWT.