azure ad b2c ze spa i webapi

Sep 25 2020

Nie mam pojęcia, jak działa Azure B2C, gdy SPA rozmawia z interfejsami API zaplecza. Mamy aplikację VUE, która pobiera dane z podstawowych interfejsów API sieci Web ASPNet. Połączyłem VUE z APP na Azure B2C i mogę się zalogować i pobrać token dostępu, ale.

Jak działa uwierzytelnianie / autoryzacja między SPA i API?

TIA

Odpowiedzi

1 RubberChickenLeader Sep 29 2020 at 21:29

Azure B2C używa OATH 2 / OpenID Connect jako głównego sposobu zabezpieczania aplikacji jednostronicowych i interfejsów API. OATH 2 korzysta z tokenów sieciowych Json (bezstanowych tokenów podpisanych kryptograficznie) w celu zapewnienia uwierzytelniania między wieloma usługami (OpenID Connect jest rozszerzeniem OATH 2).

Aplikacja kliencka (w tym przypadku SPA) poprosi usługę Azure AD B2C o tokeny JWT. Jeśli użytkownik jest zalogowany do B2C, usługa tokenu zabezpieczającego wydałaby tokeny do użycia przez SPA.

Gdy SPA wywołuje API, token ID z usługi tokenu zabezpieczającego (w przepływie OpenID Connect) zostanie wysłany do API w Authorizationnagłówku ( ). Interfejs API może następnie zweryfikować token na podstawie bloku podpisu tokena JWT, aby sprawdzić, czy token został wydany przez usługę tokenu zabezpieczającego i nie został zmodyfikowany. Ze względu na relację zaufania między STS a API (API ufa STS), API następnie uwierzytelnia i autoryzuje różne wywołania API na podstawie prezentowanego tokena JWT.Authorization: Bearer $token$

Ponieważ SPA działa i uzyskujesz tokeny, wszystko, co musisz teraz zrobić, to skonfigurować interfejs API sieci Web, aby akceptował JWT z B2C. Korzystając z Microsoft.AspNetCore.Authentication.JwtBearer, poniższy kod powinien być blisko rozpoczęcia i uruchomienia

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

(powyższy kod z próbek lazurowych , nie jest już obsługiwany.

Chociaż w idealnym przypadku zarówno SPA, jak i API byłyby zarejestrowane jako oddzielni klienci w usłudze STS, można użyć tego samego identyfikatora klienta, aby nie trzeba było przechowywać dwóch zestawów tokenów, jednego dla klienta SPA i jednego dla interfejsu API. W obecnym projekcie, nad którym pracuję, wiele SPA jest zarejestrowanych jako klienci, a następnie API ma AddJwtBearerakceptację wielu odbiorców

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

Daje mi to wystarczające bezpieczeństwo dla mojej aplikacji, a interfejs API nie musi być rejestrowany jako klient u dostawcy tożsamości.