azure ad b2c com spa e webapi

Sep 25 2020

Estou confuso sobre como o Azure B2C funciona quando o SPA está falando com APIs de back-end. Temos um aplicativo VUE que recupera dados das principais APIs da Web ASPNet. Eu conectei o VUE com o APP no Azure B2C e posso fazer login e recuperar o token de acesso, mas.

Como funciona a autenticação / autorização entre SPA e APIs?

TIA

Respostas

1 RubberChickenLeader Sep 29 2020 at 21:29

O Azure B2C usa OATH 2 / OpenID Connect como a principal forma de proteger aplicativos de página única e APIs. O OATH 2 usa Json Web Tokens ( tokens sem estado assinados criptograficamente) para fornecer autenticação entre vários serviços (OpenID Connect é uma extensão do OATH 2).

O aplicativo Cliente (o SPA, neste caso) solicitaria ao Azure AD B2C tokens JWT. Se o usuário estiver conectado ao B2C, o serviço de token de segurança emitirá tokens para o SPA usar.

Quando o SPA chama a API, o token de ID do serviço de token de segurança (no fluxo do OpenID Connect) seria enviado para a API no Authorizationcabeçalho ( ). A API pode então validar o token com base no bloco de assinatura do JWT para validar se o token foi emitido pelo serviço de token de segurança e não foi modificado. Por causa da relação de confiança entre o STS e a API (a API confia no STS), a API então autentica e autoriza as várias chamadas de api com base no JWT que é apresentado.Authorization: Bearer $token$

Como o SPA está funcionando e recebendo tokens, tudo o que você precisa fazer a seguir é configurar a API da Web para aceitar o JWT do B2C. Usando Microsoft.AspNetCore.Authentication.JwtBearer, o código a seguir deve estar perto de colocá-lo em funcionamento

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

(código acima de amostras azuis , não é mais mantido.

Embora o ideal seja que o SPA e a API sejam registrados como clientes separados com o STS, você pode usar o mesmo ID do cliente para que não precise manter dois conjuntos de tokens, um para o cliente SPA e outro para a API. No projeto atual em que estou trabalhando, vários SPAs são registrados como clientes e a API tem um AddJwtBearerque aceita vários públicos

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

Isso me dá segurança suficiente para meu aplicativo e a API não precisa ser registrada como um cliente com o IDP.