sábado, 22 de agosto de 2020

Obtención de token JwtBearer desde Azure AD, para el consumo de una API registrada como aplicación en Azure

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

 


Transacciones Fiori

  /UI2/CACHE Register service for UI2 cache use /UI2/CACHE_DEL Delete cache entries /UI2/CHIP Chip Registration /UI2/CUST Customizing of UI ...