azure ad b2c con spa y webapi

Sep 25 2020

Estoy confundido acerca de cómo funciona Azure B2C cuando SPA está hablando con las API de backend. Tenemos una aplicación VUE que recupera datos de las API web principales de ASPNet. Conecté el VUE con la APLICACIÓN en Azure B2C y puedo iniciar sesión y recuperar el token de acceso, pero.

¿Cómo funciona la autenticación / autorización entre SPA y API?

TIA

Respuestas

1 RubberChickenLeader Sep 29 2020 at 21:29

Azure B2C usa OATH 2 / OpenID Connect como la forma principal de proteger las aplicaciones y API de una sola página. OATH 2 usa Json Web Tokens ( tokens sin estado firmados criptográficamente) para proporcionar autenticación entre múltiples servicios (OpenID Connect es una extensión de OATH 2).

La aplicación Cliente (el SPA en este caso) solicitaría tokens JWT a Azure AD B2C. Si el usuario ha iniciado sesión en B2C, el servicio de token de seguridad emitirá tokens para que los utilice el SPA.

Cuando el SPA llama a la API, el token de ID del servicio de token de seguridad (en el flujo de OpenID Connect) se enviará a la API en el Authorizationencabezado ( ). Luego, la API podría validar el token en función del bloque de firma del JWT para validar que el token fue emitido por el servicio de token de seguridad y no se ha modificado. Debido a la relación de confianza entre el STS y la API (la API confía en el STS), la API luego autentica y autoriza las diversas llamadas a la API en función del JWT que se presenta.Authorization: Bearer $token$

Dado que tiene el SPA funcionando y obteniendo tokens, todo lo que necesita hacer a continuación es configurar la API web para aceptar el JWT de B2C. Usando Microsoft.AspNetCore.Authentication.JwtBearer, el siguiente código debería estar cerca de ponerlo en funcionamiento

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 anterior de muestras azules , ya no se mantiene.

Si bien lo ideal es que tanto el SPA como la API se registren como clientes separados con el STS, podría usar la misma ID de cliente para no tener que mantener dos conjuntos de tokens, uno para el cliente SPA y otro para la API. En el proyecto actual en el que estoy trabajando, se registran múltiples SPA como clientes, luego la API tiene una AddJwtBearerque acepta múltiples audiencias

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

Esto me da suficiente seguridad para mi aplicación y la API no necesita estar registrada como cliente con el IDP.