Saltar a contenido

Administración Usuario

Librería Andreani.AzureB2C.Admin.ApiClient

Es una librería que facilita la tarea de hacer llamados a la Validation API de B2C Admin, la cual se usa para la autenticación de usuarios Azure B2C

Al mismo tiempo se implementan una serie de filtros personalizados. Mediante un JSON se puede especificar, de una forma más minuciosa, los campos requeridos de un usuario.


Para empezar, en el archivo Startup.cs tenemos que definir un método en el que meteremos AddAuthorizationApiClient y su configuración. (si utilizamos la configuracion vieja) o al archivo Program.cs y declarar el services

      // Ejemplo con nueva defición de Program

      // Configuramos el Services para las DI

      var builder = WebApplication.CreateBuilder(args);

      builder.Host.ConfigureAndreaniWebHost(args);
      builder.Services.ConfigureAndreaniServices();
      builder.Services.AddApplication();
      builder.Services.AddInfrastructure(builder.Configuration);
      builder.Services.AddAuthorizationApiClient(builder.Configuration);

      var app = builder.Build();

      // Configuramos el middleware
      app.ConfigureAndreani();
    public void ConfigureServices(IServiceCollection services)
    {
      //...
        services.AddAuthorizationApiClient(Configuration);
    }

En nuestro appsettings se necesita de una Url, Token y Retry.

    "AzureB2C":
    {
        "Url": "https://b2c-admin-api-architecture-it-test.apps.ocptest.andreani.com.ar",
        "Token": "a2d64249-d82a-44b9-aaf2-952653aaf3ca",
        "Retry": "3"
    }
    AzureB2C:
        Url: "https://b2c-admin-api-architecture-it-test.apps.ocptest.andreani.com.ar",
        Token: "a2d64249-d82a-44b9-aaf2-952653aaf3ca",
        Retry: "3"
Nombre Descripción
Url Dirección base de datos.
Token Clave de Autorización.
Retry Cantidad de reintentos para consumir la API.

Una vez instalada y configurada la librería, se dispone de dos Interfaces: IUsersClient y IAppsClient:

IUsersClient:

Para usarla se tiene que implementar una inyección de dependencia como se muestra:

private readonly IUsersClient _client;

public AppsServices(IUsersClient client)
{
  _clientUser = client;
}
En IUsersClient se encuentran los siguientes metodos:

Nombre Requiere
ListAppsByUser username
ListAppsByUserInCollection username, appId
UpdateUserInCollection username, appId, body
DeleteUserInCollection username, appId
  • ListAppsByUser devuelve el listado que contiene las Apps del usuario, recibe el parametro username.
    [Get("/users/{username}/apps")]
    public Task<ApiResponse<List<ApplicationLogon>>> ListAppsByUser(string username);
    
    Llamada al metodo:
    await _client.ListAppsByUser("customUser@andreani.com");
    

    Response 200 - Ok:

    [
      {
        "appId": "a2d64249-d82a-44b9-aaf2-952653aaf3ce",
        "lastLogon": "165461236"
      }
    ]
    

  • ListAppsByUserInCollection devuelve el listado de claims de un usuario en una aplicacion especifica, recibe por parametro username y appId.
    [Get("/users/{username}/apps/{appId}")]
    public Task<ApiResponse<List<ApplicationLogon>>> ListAppsByUserInCollection(string username, string appId);
    
    Llamada al metodo:
    await _client.ListAppsByUserInCollection("customUser@andreani.com", "a2d64249-d82a-44b9-aaf2-952653aaf3ce");
    

    Response 200 - Ok:

    {
      "key1": "string",
      "key2": "string"
    }
    

  • UpdateUserInCollection permite modificar los claims de un usuario en una aplicacion especificada, recibe por parametro username, appId y body.
    [Post("/users/{username}/apps/{appId}")]
    public Task<ApiResponse<List<ApplicationLogon>>> UpdateUserInCollection<T>(string username, string appId, [Body] T body);
    
    Llamada al metodo:
    var body = 
    {
      "key": "value"
    }
    await _client.UpdateUserInCollection("customUser@andreani.com", "a2d64249-d82a-44b9-aaf2-952653aaf3ce", body);
    

    Response 204 - No Content.

  • DeleteUserInCollection elimina los claims de un usuario en una aplicacion especificada, recibe por parametro username y appId.
    [Get("/users/{username}/apps/{appId}")]
    public Task<ApiResponse<List<ApplicationLogon>>> DeleteUserInCollection(string username, string appId);
    
    Llamada al metodo:
    await _client.("customUser@andreani.com", "a2d64249-d82a-44b9-aaf2-952653aaf3ce");
    

    Response 200 - Ok.

Para ver mas sobre estos metodos, ingrese aquí


IAppsAdapterClient

En este caso no hay que usar AppsClient como tal, ya que se creó un adapter llamado IAppsAdapterClient, el cual es el que se va a inyectar:

private readonly IAppsAdapterClient _client;

public AppsServices(IAppsAdapterClient client)
{
  _clientApp = client;
}

En IAppsAdapterClient se encuentran los siguientes metodos:

Nombre Requiere
GetUserByApps appId, filter
GetUserByApps appId, operador logico (AND o OR), array(filtros)
ListUser appId, domain (opcional)
GetUserByAppsQuery appId, query (mongo)

Una cualidad que tiene GetUserByApps, es que se le puede pasara un objeto a modo de filtro:

 protected async Task SearchUserByRoleDescription()
{

    // Se instancia un Objeto llamdo filter, en este caso se busca filtrar por descripcion "Administrador Andreani".

    var filter = new FilterByRole
    {
      Roles = new RoleFilterByDescripcion
        {
          Descripcion = "Administrador Andreani"
        }
    };

    // A GetUserByApps le enviamos un AppId, de nuestra base de datos, y el filtro.

    var appId = "a2d64249-d82a-44b9-aaf2-952653aaf3ca";
    var response = await _clientApp.GetUserByApps<UsersResponse, FilterByRole>(appId, filter);

    if (response.IsSuccessStatusCode)
    {
      Console.WriteLine(JsonConvert.SerializeObject(response.Content));
    }
}

Además los filtros cuentan con un conjunto de operadores (Distinto, Mayor, MayorIgual, Menor, MenorIgual).

var filter = new FilterByOperador
{
    Roles = new RoleFilterById
    {
      Id = new Mayor("2")
    }
};

También se le puede utilizar los operadores OR y AND

Nombre Requiere
GetUserByApps appId, operador, filter_1, filter_2 ... filter_n
 protected async Task FilterOr()
        {
            var filter_1 = new
            {
                Roles = new RoleFilterById
                {
                    Nombre = "AdminPartner",

                }
            };
            var filter_2 = new
            {
                Roles = new RoleFilterById
                {
                    Nombre = "AdminAndreani",

                }
            };

            var filter_3 = new
            {
                Apellido = "Privitello"
            };

            var appId = "a2d64249-d82a-44b9-aaf2-952653aaf3ca";

            var response = await _clientApp.GetUserByApps<UsersResponse>(appId, OperatorsOptions.OperatorsType.OR, filter_1, filter_2, filter_3);

            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine(JsonConvert.SerializeObject(response.Content));
            }
        }

Sino tambien cuenta con la opción de enviar un Query de MongoDB por string:

        protected async Task SearchUserByQuery()
        {
            string json = "{\"$or\": [{\"jsonData.Nombre\":\"Administrador Partner\"},{\"jsonData.Id\":{\"$lte\": 1 }}]}";
            var response = await _clientApp.GetUserByAppsQuery<UsersResponse>("a2d64249-d82a-44b9-aaf2-952653aaf3ca", json);
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine(JsonConvert.SerializeObject(response.Content));
            }

        }

Dispone de un ejemplo donde se aplica todo esto en /src/Andreani.AzureB2C.Admin.ApiClient.Example/ Y la documentación de MongoDB: Aquí