Credenziali del certificato per l'autenticazione di un'applicazione con Microsoft Identity Platform
Microsoft Identity Platform consente a un'applicazione di usare le proprie credenziali per l'autenticazione ovunque sia possibile usare un segreto client, ad esempio nel flusso di concessione delle credenziali client OAuth 2.0 e nel flusso OBO (On-behalf-of).
Una forma di credenziale che un'applicazione può usare per l'autenticazione è un'asserzione JWT (JSON Web Token) firmata con un certificato di proprietà dell'applicazione. Questo è descritto nella specifica OpenID Connect per l'opzione private_key_jwt
di autenticazione client.
Se si è interessati a usare un token JWT rilasciato da un altro provider di identità come credenziale per l'applicazione, vedere Federazione delle identità del carico di lavoro per informazioni su come configurare un criterio federativo.
Formato di asserzione
Per calcolare l'asserzione, è possibile usare una delle numerose librerie JWT nel linguaggio preferito. MSAL supporta questa operazione usando .WithCertificate()
. Le informazioni vengono trasportate dal token nella relativa intestazione, attestazioni e firma.
Intestazione
Parametro | Commento |
---|---|
alg |
Deve essere PS256 |
typ |
Deve essere JWT |
x5t#s256 |
Identificazione personale SHA-256 con codifica Base64url della codifica DER del certificato X.509. |
Attestazioni (payload)
Tipo di attestazione | valore | Descrizione |
---|---|---|
aud |
https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token |
L'attestazione "aud" (audience) identifica i destinatari per cui il token JWT è destinato (qui Microsoft Entra ID) Vedere RFC 7519, sezione 4.1.3. In questo caso, il destinatario è il server di accesso (login.microsoftonline.com ). |
exp |
1601519414 | L'attestazione "exp" (scadenza) identifica l'ora di scadenza in o dopo la quale il token JWT non deve essere accettato per l'elaborazione. Vedere RFC 7519, sezione 4.1.4. In questo modo l'asserzione può essere usata fino a quel momento, quindi mantenerla breve- 5-10 minuti dopo nbf al massimo. Microsoft Entra ID non pone restrizioni al exp momento. |
iss |
{ClientID} | L'attestazione "iss" (autorità di certificazione) identifica l'entità che ha emesso il token JWT, in questo caso l'applicazione client. Usare l'ID applicazione GUID. |
jti |
(guid) | l'attestazione "jti" (JWT ID) fornisce un identificatore univoco per il token JWT. Il valore dell'identificatore deve essere assegnato in modo da garantire che vi sia una probabilità trascurabile che lo stesso valore venga assegnato accidentalmente a un oggetto dati diverso. Se l'applicazione usa più emittenti, è necessario impedire conflitti tra i valori prodotti anche da autorità emittenti diverse. Il valore "jti" è una stringa con distinzione tra maiuscole e minuscole. RFC 7519, Sezione 4.1.7 |
nbf |
1601519114 | L'attestazione "nbf" (not before) identifica l'ora prima della quale il token JWT non deve essere accettato per l'elaborazione. RFC 7519, sezione 4.1.5. L'uso dell'ora corrente è appropriato. |
sub |
{ClientID} | L'attestazione "sub" (oggetto) identifica l'oggetto del token JWT, in questo caso anche l'applicazione. Usare lo stesso valore di iss . |
iat |
1601519114 | l'attestazione "iat" (issued at) identifica l'ora in cui è stato emesso il token JWT. Questa attestazione può essere usata per determinare l'età del token JWT. RFC 7519, sezione 4.1.5. |
Firma
La firma viene calcolata applicando il certificato come descritto nella specifica json Web Token RFC7519. Usare la spaziatura interna PSS.
Esempio di asserzione del token JWT decodificata
{
"alg": "PS256",
"typ": "JWT",
"x5t#sha256": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u"
}
.
{
"aud": "https: //login.microsoftonline.com/contoso.onmicrosoft.com/oauth2/v2.0/token",
"exp": 1484593341,
"iss": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"jti": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"nbf": 1484592741,
"sub": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"
}
.
"A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u..."
Esempio di asserzione del token JWT codificata
La stringa seguente è un esempio di asserzione codificata. Se si osserva attentamente, si notano tre sezioni separate da punti (.
):
- La prima sezione codifica l'intestazione
- La seconda sezione codifica le attestazioni (payload)
- L'ultima sezione è la firma calcolata con i certificati del contenuto delle prime due sezioni
"eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJhdWQiOiJodHRwczpcL1wvbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbVwvam1wcmlldXJob3RtYWlsLm9ubWljcm9zb2Z0LmNvbVwvb2F1dGgyXC90b2tlbiIsImV4cCI6MTQ4NDU5MzM0MSwiaXNzIjoiOTdlMGE1YjctZDc0NS00MGI2LTk0ZmUtNWY3N2QzNWM2ZTA1IiwianRpIjoiMjJiM2JiMjYtZTA0Ni00MmRmLTljOTYtNjVkYmQ3MmMxYzgxIiwibmJmIjoxNDg0NTkyNzQxLCJzdWIiOiI5N2UwYTViNy1kNzQ1LTQwYjYtOTRmZS01Zjc3ZDM1YzZlMDUifQ.
Gh95kHCOEGq5E_ArMBbDXhwKR577scxYaoJ1P{a lot of characters here}KKJDEg"
Registrare un certificato con Microsoft Identity Platform
È possibile associare le credenziali del certificato all'applicazione client in Microsoft Identity Platform tramite l'interfaccia di amministrazione di Microsoft Entra usando uno dei metodi seguenti:
Caricamento del file del certificato
Nella scheda Registrazioni app per l'applicazione client:
- Selezionare Certificati e certificati segreti>.
- Selezionare Carica certificato e selezionare il file del certificato da caricare.
- Selezionare Aggiungi. Dopo aver caricato il certificato, vengono visualizzati i valori di identificazione personale, data di inizio e scadenza.
Aggiornamento del manifesto dell'applicazione
Dopo aver acquisito un certificato, calcolare questi valori:
$base64Thumbprint
- Valore con codifica Base64 dell'hash del certificato$base64Value
- Valore con codifica Base64 dei dati non elaborati del certificato
Specificare un GUID per identificare la chiave nel manifesto dell'applicazione ($keyId
).
Nella registrazione dell'app di Azure per l'applicazione client:
Selezionare Manifesto per aprire il manifesto dell'applicazione.
Sostituire la proprietà keyCredentials con le nuove informazioni del certificato usando lo schema seguente.
"keyCredentials": [ { "customKeyIdentifier": "$base64Thumbprint", "keyId": "$keyid", "type": "AsymmetricX509Cert", "usage": "Verify", "value": "$base64Value" } ]
Salvare le modifiche apportate al manifesto dell'applicazione e caricare il manifesto in Microsoft Identity Platform.
La proprietà
keyCredentials
è multivalore, quindi è possibile caricare più certificati per una gestione delle chiavi più avanzata.
Uso di un'asserzione client
Le asserzioni client possono essere usate ovunque venga usato un segreto client. Ad esempio, nel flusso del codice di autorizzazione è possibile passare un oggetto client_secret
per dimostrare che la richiesta proviene dall'app. È possibile sostituirlo con client_assertion
i parametri e client_assertion_type
.
Parametro | valore | Descrizione |
---|---|---|
client_assertion_type |
urn:ietf:params:oauth:client-assertion-type:jwt-bearer |
Si tratta di un valore fisso che indica che si usa una credenziale del certificato. |
client_assertion |
JWT |
Questo è il token JWT creato in precedenza. |
Passaggi successivi
La libreria MSAL.NET gestisce questo scenario in una singola riga di codice.
L'applicazione console daemon .NET che usa l'esempio di codice di Microsoft Identity Platform in GitHub illustra come un'applicazione usa le proprie credenziali per l'autenticazione. Illustra anche come creare un certificato autofirmato usando il New-SelfSignedCertificate
cmdlet di PowerShell. È anche possibile usare gli script di creazione dell'app nel repository di esempio per creare certificati, calcolare l'identificazione personale e così via.