Autenticar en Microsoft Dataverse mediante OAuth

Completado

Microsoft Dataverse utiliza OAuth 2.0 como estándar de autenticación. OAuth 2.0 proporciona un estándar del sector para autenticar aplicaciones cliente y concederles acceso a un recurso.

Autenticación frente a autorización

Autenticación es el proceso o la acción de comprobar la identidad de un usuario o un proceso. La solución de Microsoft para este proceso de comprobación es Microsoft Entra ID. Entra ID admite muchas opciones para comprobar la identidad de un usuario o un proceso. La omisión del proveedor de identidades permite separar correctamente las preocupaciones, porque la administración de nombres de usuario y contraseñas puede ser un proceso difícil (y arriesgado).

Nota

Microsoft Entra ID es el nuevo nombre para Azure Active Directory. Todas las licencias y funcionalidades siguen siendo las mismas.

Autorización es el proceso o la acción de comprobar si un usuario autenticado está autorizado para obtener acceso al recurso. Actualmente, la autorización de Dataverse se da en el nivel de inquilino de Entra ID, mientras que la administración de los permisos detallados se delegan a la aplicación en función del usuario que ha iniciado sesión en ese momento. Por lo tanto, no utiliza OAuth 2.0 para controlar la seguridad en el nivel de aplicación, que gestionaría con los roles de seguridad de Dataverse y la asignación a usuarios con el Centro de administración de Power Apps.

Si desea obtener más información sobre los conceptos de autenticación y autorización, consulte la sección Conceptos básicos sobre la autenticación.

Registrar aplicaciones de Dataverse con Entra ID

Para conectarse correctamente a Dataverse, primero debe registrar una aplicación con Entra ID, proceso que puede completar en el Azure Portal. En función del tipo de aplicación que desee crear, habrá distintas configuraciones disponibles que podrá definir (aplicaciones web frente a aplicaciones nativas instaladas de forma nativa en un dispositivo). Para obtener más información sobre la configuración necesaria para cada uno de estos tipos, consulte Tipos de registro de aplicaciones.

Para registrar una aplicación con Entra ID, puede ir a la sección Registros de aplicaciones del menú Entra ID (Azure Active Directory) y, a continuación, seleccionar Nuevo registro.

Captura de pantalla de la sección de registros de aplicaciones del menú de Entra ID y Nuevo registro seleccionado

Especifique el nombre de su aplicación y el tipo de acceso de cuenta que necesita. Si está registrando una aplicación web, especifique un URI de redireccionamiento; para ello, vaya a la sección Autenticación, establezca el tipo en Web y, a continuación, introduzca un URI de redireccionamiento.

Captura de pantalla del nombre para mostrar accesible por los usuarios, el tipo de cuenta y la URL de redireccionamiento

En la siguiente lista se resume cuándo usar los diferentes tipos de cuenta:

  • Cuentas en este directorio organizativo solamente (inquilino único)

    Todas las cuentas de usuario e invitado en su directorio pueden usar su aplicación o API.

    Utilice esta opción si el público objetivo es interno de la organización.

  • Cuentas en cualquier directorio organizativo (cualquier directorio de Entra ID; varios inquilinos)

    Todos los usuarios con una cuenta profesional o educativa de Microsoft pueden usar su aplicación o API, incluidas las escuelas y empresas que usan Microsoft 365.

    Utilice esta opción si su público objetivo son clientes empresariales o educativos y para habilitar la arquitectura multiempresa.

  • Cuentas en cualquier directorio organizativo (cualquier directorio de Entra ID: varios inquilinos) y cuentas Microsoft personales (por ejemplo, Skype y Xbox)

    Todos los usuarios con una cuenta profesional, educativa o personal de Microsoft pueden usar su aplicación o API. Esto incluye escuelas y empresas que usan Microsoft 365, así como cuentas personales que se utilizan para iniciar sesión en servicios como Xbox y Skype.

En función de la complejidad de la configuración de su aplicación, es posible que desee definir otras configuraciones de autenticación. Consulte la documentación de Entra ID para conocer los pasos para completar esta tarea.

Acceder a Dataverse mediante la API web

Todo el acceso a Dataverse se realiza en el contexto de un usuario registrado. Puede ser un usuario interactivo normal o un usuario no interactivo que utiliza la autenticación de servidor a servidor (S2S).

Cuando una aplicación accede a Dataverse en nombre de un usuario interactivo, la aplicación registrada debe configurarse con permisos de API para acceder a Dataverse con un permiso delegado. Cuando una aplicación accede directamente a Dataverse, un usuario de la aplicación asociado con el registro de la aplicación de Entra ID debe crearse en Dataverse. Al usar la autenticación S2S, no se requieren los permisos delegados de la API de Dataverse.

En todos los casos, los usuarios autenticados deben tener roles de seguridad de Dataverse asociados al usuario que permitan realizar las operaciones mediante la API web.

Configurar permisos de API

Si su aplicación va a acceder a Dataverse en nombre de un usuario registrado, vaya a la pestaña Permisos de API en la aplicación registrada y asegúrese de que su aplicación conceda acceso de suplantación de usuario a su entorno de Dataverse.

Captura de pantalla de la pestaña Solicitar permisos de API

La etiqueta dice Dynamics CRM, que es un nombre histórico del producto precursor de Dataverse.

Captura de pantalla de la pestaña Solicitar permisos de API con los permisos delegados y la user_impersonation seleccionados

Configurar un usuario de la aplicación de Dataverse

Cuando se utiliza la autenticación S2S se debe configurar un usuario de la aplicación de Dataverse en cada entorno de Dataverse, al que se accederá con la API web.

La configuración de los usuarios de la aplicación de Dataverse se realiza desde el Centro de administración de Power Platform como administrador del sistema.

Captura de pantalla de una aplicación que se agrega desde Entra ID

Desde el centro de administración puede realizar los siguientes pasos:

  • Crear un nuevo usuario de la aplicación

  • Asociar el usuario de la aplicación con la aplicación de Entra ID o la identidad administrada

  • Configurar los roles de seguridad de Dataverse que se aplican

Para obtener una revisión paso a paso más detallada, consulte Administrar los usuarios de la aplicación en el Centro de administración de Power Platform.

Usar bibliotecas de autenticación para conectarse

Una vez registrada su aplicación, utilice una de las Bibliotecas de autenticación de la plataforma de identidad de Microsoft para realizar la autenticación y adquirir un token de acceso para usar con la API web.

El siguiente código es un extracto del ejemplo de Inicio rápido mejorado que utiliza la biblioteca de autenticación de Microsoft (MSAL). La siguiente clase OAuthMessageHandler implementa una clase derivada de DelegatingHandler, que se transferirá al constructor de HttpClient. Este controlador le permite reemplazar el método HttpClient.SendAsync para que los métodos de llamada AcquireToken* actualicen el token de acceso con cada solicitud enviada por el cliente Http.

class OAuthMessageHandler : DelegatingHandler
{
  private AuthenticationHeaderValue authHeader;
  public OAuthMessageHandler(string serviceUrl, string clientId, string redirectUrl, string username, string password, HttpMessageHandler innerHandler)
  : base(innerHandler)
  {
    //Build Microsoft.Identity.Client (MSAL) OAuth Token Request
    var clientApplication = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs)
    .WithRedirectUri(redirectUrl)
    .Build();
    var scope = serviceUrl + "//.default";
    string[] scopes = { scope };
    AuthenticationResult authBuilderResult;
    if (username != string.Empty && password != string.Empty)
    {
      //Make silent Microsoft.Identity.Client (MSAL) OAuth Token Request
      var securePassword = new SecureString();
      foreach (char ch in password) securePassword.AppendChar(ch);
      authBuilderResult = clientApplication.AcquireTokenByUsernamePassword(scopes, username, securePassword).ExecuteAsync().Result;
    }
    else
    {
      //Popup authentication dialog box to get token
      authBuilderResult = clientApplication.AcquireTokenInteractive(scopes).ExecuteAsync().Result;
    }
      //Note that an Entra ID access token has a finite lifetime, default expiration is 60 minutes.
      authHeader = new AuthenticationHeaderValue("Bearer", authBuilderResult.AccessToken);
    }
  protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
  {
    request.Headers.Authorization = authHeader;
    return base.SendAsync(request, cancellationToken);
  }
}

Podría tener un método auxiliar para obtener la instancia de HttpClient mediante el controlador:

static HttpClient GetHttpClient(string url, string clientId, string redirectUrl, string version = "v9.2")
{
  try
  {
    HttpMessageHandler messageHandler = new OAuthMessageHandler(url, clientId, redirectUrl, "", "",
    new HttpClientHandler());
    HttpClient httpClient = new HttpClient(messageHandler)
    {
      BaseAddress = new Uri(string.Format("{0}/api/data/{1}/", url, version)),
      Timeout = new TimeSpan(0, 2, 0) //2 minutes
    };
  return httpClient;
  }
  catch (Exception)
  {
    throw;
  }
}

Y, finalmente, use la instancia del cliente para hacer una llamada a la API web:

using (HttpClient client = GetHttpClient("https://yourenvname.api.crm.dynamics.com", "51f81489-12ee-4a9e-aaae-a2591f45987d", "http://localhost:8080"))
{
  // Use the WhoAmI function
  var response = client.GetAsync("WhoAmI").Result;
  if (response.IsSuccessStatusCode)
  {
    //Get the response content and parse it.
    JObject body = JObject.Parse(response.Content.ReadAsStringAsync().Result);
    Guid userId = (Guid)body["UserId"];
    Console.WriteLine("Your UserId is {0}", userId);
  }
  else
  {
    Console.WriteLine("The request failed with a status of '{0}'", response.ReasonPhrase);
  }
  Console.WriteLine("Press any key to exit.");
  Console.ReadLine();
}

Ahora debería tener una aplicación registrada que sea capaz de conectarse con éxito a su entorno de Dataverse. También tiene un ejemplo simple de conexión y uso de la aplicación registrada para acceder a una operación de API web.