azzurro ad b2c con spa e webapi
Sono confuso su come funziona Azure B2C quando SPA sta parlando con le API back-end. Abbiamo un'app VUE che recupera i dati dalle API Web principali di ASPNet. Ho collegato VUE con l'APP su Azure B2C e posso accedere e recuperare il token di accesso, ma.
Come funziona l'autenticazione / autorizzazione tra SPA e API?
TIA
Risposte
Azure B2C usa OATH 2 / OpenID Connect come metodo principale per proteggere app e API a pagina singola. OATH 2 utilizza Json Web Tokens (token firmati crittograficamente senza stato) per fornire l'autenticazione tra più servizi (OpenID Connect è un'estensione di OATH 2).
L'applicazione client (la SPA in questo caso) richiederebbe ad Azure AD B2C i token JWT. Se l'utente è connesso a B2C, il servizio token di sicurezza emetterà token per l'utilizzo da parte di SPA.
Quando la SPA chiama l'API, il token ID dal servizio token di sicurezza (nel flusso OpenID Connect) verrà inviato all'API Authorizationnell'intestazione ( ). L'API potrebbe quindi convalidare il token in base al blocco della firma del JWT per convalidare che il token è stato emesso dal servizio token di sicurezza e non è stato modificato. A causa della relazione di fiducia tra STS e API (l'API considera attendibile STS), l'API autentica e autorizza le varie chiamate API in base al JWT presentato.Authorization: Bearer $token$
Dato che la SPA funziona e riceve i token, tutto ciò che devi fare è configurare l'API Web per accettare il JWT da B2C. Utilizzando Microsoft.AspNetCore.Authentication.JwtBearer il codice seguente dovrebbe essere vicino a farti diventare operativo
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions =>
{
jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
jwtOptions.Events = new JwtBearerEvents
{
OnAuthenticationFailed = AuthenticationFailed
};
});
(codice precedente da campioni azzurri , non più mantenuto.
Sebbene idealmente sia SPA che API dovrebbero essere registrati come client separati con STS, è possibile utilizzare lo stesso ID client in modo da non dover mantenere due set di token, uno per il client SPA e uno per l'API. Nel progetto corrente su cui sto lavorando, più SPA sono registrate come client, quindi l'API ha una AddJwtBearerche accetta più pubblici
.AddJwtBearer(options =>
{
options.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = true,
ValidAudiences = new List<string>
{
Configuration["AzureAdB2C:ClientId1"];,
Configuration["AzureAdB2C:ClientId2"];
}
};
}
Questo mi dà abbastanza sicurezza per la mia app e non è necessario che l'API sia registrata come client con IDP.