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;
}
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 parametrousername
.Llamada al metodo:[Get("/users/{username}/apps")] public Task<ApiResponse<List<ApplicationLogon>>> ListAppsByUser(string username);
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 parametrousername
yappId
.Llamada al metodo:[Get("/users/{username}/apps/{appId}")] public Task<ApiResponse<List<ApplicationLogon>>> ListAppsByUserInCollection(string username, string appId);
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 parametrousername
,appId
ybody
.Llamada al metodo:[Post("/users/{username}/apps/{appId}")] public Task<ApiResponse<List<ApplicationLogon>>> UpdateUserInCollection<T>(string username, string appId, [Body] T body);
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 parametrousername
yappId
.Llamada al metodo:[Get("/users/{username}/apps/{appId}")] public Task<ApiResponse<List<ApplicationLogon>>> DeleteUserInCollection(string username, string appId);
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í