Una manera de autenticar API's que están en la nube cuando se
utiliza Azure como plataforma de nube es utilizar el Directorio activo como
administrador de las identidades es posible pedirle a Azure AD que de un
registro de una aplicación "no interactiva" nos pueda enviar un token
que pueda ser enviado a la API que consumiremos misma que estará autenticada y
autorizada en Azure AD.
Para ver el detalle de cómo hacer el
registro de una API en Azure ver el siguiente post, el cual viene muy completo
y sencillo, sin embargo, el tema de clientes para Xamarin y Blazor no lo
menciona, que es justo lo que se anexa en este post:
https://dotnetplaybook.com/secure-a-net-core-api-using-bearer-authentication/
Una vez habiendo hecho el registro de la API y del cliente de esa
API y habiendo publicado la API es momento de consumirla y para ello nos puede
ser útil los siguientes métodos. El primero aplica para Xamarin y para Blazor
Hybrid Mobile. Y el segundo para aplicaciones tanto Blazor, .NET Core y ASP.NET
Core.
Método para obtener
el token y un cliente http listo para invocar la API en Xamarin y Blazor Hybrid
Mobile usando MSAL.NET.
private async Task < HttpClient > GetSecureClient()
{
Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult
authresult = null;
var auth = new AuthenticationContext(cfg.Authority);
authresult = await auth.AcquireTokenAsync(cfg.ResourceId, new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(cfg.ClientId, cfg.ClientSecret));
HttpClient cte = new HttpClient() { BaseAddress = this.BaseAddress };
var defaultRequestHeaders = cte.DefaultRequestHeaders;
if (defaultRequestHeaders.Accept == null ||
!defaultRequestHeaders.Accept.Any(m =>m.MediaType == "application/json"))
{
cte.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
}
defaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer",
authresult.AccessToken);
return cte;
}
Método para obtener
el token y un cliente http listo para invocar la API en .NET Core, ASP.NET Core
Web API y Blazor usando Microsoft.Identity.Client.
private async Task<HttpClient> GetSecureClient()
{
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(cfg.ClientId).
WithClientSecret(cfg.ClientSecret).
WithAuthority(new Uri(cfg.Authority)).Build();
string[] ResourcesIds = new string[] { cfg.ResourceID };
AuthenticationResult authresult = null;
authresult = await app.AcquireTokenForClient(ResourcesIds).ExecuteAsync();
HttpClient cte = new HttpClient() { BaseAddress = this.BaseAddress };
var defaultRequestHeaders = cte.DefaultRequestHeaders;
if (defaultRequestHeaders.Accept == null ||
!defaultRequestHeaders.Accept.Any(m => m.MediaType == "application/json"))
{
cte.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
}
defaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer", authresult.AccessToken);
return cte;
}