Azure Ad B2C mit Spa und Webapi

Sep 25 2020

Ich bin verwirrt darüber, wie Azure B2C funktioniert, wenn SPA mit Backend-APIs spricht. Wir haben eine VUE-App, die Daten von ASPNet-Kern-Web-APIs abruft. Ich habe die VUE mit APP auf Azure B2C verbunden und kann mich anmelden und Zugriffstoken abrufen, aber.

Wie funktioniert die Authentifizierung / Autorisierung zwischen SPA und APIs?

TIA

Antworten

1 RubberChickenLeader Sep 29 2020 at 21:29

Azure B2C verwendet OATH 2 / OpenID Connect als Hauptmethode zum Sichern von Apps und APIs für einzelne Seiten. OATH 2 verwendet Json-Web-Token (zustandslose kryptografisch signierte Token), um die Authentifizierung zwischen mehreren Diensten bereitzustellen (OpenID Connect ist eine Erweiterung von OATH 2).

Die Clientanwendung (in diesem Fall das SPA) fragt Azure AD B2C nach JWT-Token. Wenn der Benutzer bei B2C angemeldet ist, stellt der Sicherheitstoken-Service Token aus, die vom SPA verwendet werden können.

Wenn das SPA die API aufruft, wird das ID-Token vom Sicherheitstoken-Dienst (im OpenID Connect-Flow) an die API im AuthorizationHeader ( ) gesendet . Die API könnte dann das Token basierend auf dem Signaturblock des JWT validieren, um zu validieren, dass das Token vom Sicherheitstoken-Dienst ausgestellt und nicht geändert wurde. Aufgrund der Vertrauensbeziehung zwischen dem STS und der API (die API vertraut dem STS) authentifiziert und autorisiert die API dann die verschiedenen API-Aufrufe basierend auf dem dargestellten JWT.Authorization: Bearer $token$

Da das SPA funktioniert und Token erhält, müssen Sie als Nächstes die Web-API einrichten, um die JWT von B2C zu akzeptieren. Bei Verwendung von Microsoft.AspNetCore.Authentication.JwtBearer sollte der folgende Code nahe daran sein, Sie zum Laufen zu bringen

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
    };
  });

(über Code aus Azure-Beispielen , nicht mehr gepflegt.

Während im Idealfall sowohl das SPA als auch die API als separate Clients beim STS registriert werden, können Sie dieselbe Client-ID verwenden, sodass Sie nicht zwei Sätze von Token aufbewahren müssen, einen für den SPA-Client und einen für die API. In dem aktuellen Projekt, an dem ich arbeite, werden mehrere SPAs als Clients registriert, dann hat die API eine, AddJwtBearerdie mehrere Zielgruppen akzeptiert

.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"]; 
        }
    };
}

Dies gibt mir genügend Sicherheit für meine App und die API muss nicht als Client beim IDP registriert werden.