Migración del uso de la biblioteca cliente de .NET a Microsoft Graph

Este artículo forma parte del paso 3: revisar los detalles de la aplicación del proceso para migrar aplicaciones.

Si la aplicación usa actualmente la biblioteca cliente de Graph de Azure Active Directory (Azure AD), cambie a la biblioteca cliente de .NET de Microsoft Graph.

En este artículo, obtendrá información sobre los siguientes pasos generales para migrar a la biblioteca cliente .NET de Microsoft Graph:

  • Cómo crear un cliente de Microsoft Graph, dado un token de acceso (que puede adquirir mediante la Biblioteca de autenticación de Azure Active Directory (ADAL) o la Biblioteca de autenticación de Microsoft (MSAL))
  • Cómo formular solicitudes
  • Uso de generadores de consultas
  • Cómo controlar colecciones y paginación

Introducción a los pasos de migración

En los pasos siguientes se supone que la aplicación usa ADAL para adquirir tokens de acceso para llamar a Azure AD Graph. El cambio a MSAL se puede realizar como un paso independiente descrito en migración a MSAL.

  1. Para adquirir un token de acceso a Microsoft Graph, actualice resourceUrl de https://graph.windows.net a https://graph.microsoft.com.

  2. En la aplicación, actualice las referencias a la biblioteca cliente de Microsoft Graph cambiando:

    using Microsoft.Azure.ActiveDirectory.GraphClient;
    

    Para:

    using Microsoft.Graph;
    
  3. Use el administrador de paquetes para descargar y actualizar el paquete NuGet de Microsoft Graph y actualizar las dependencias.

  4. Actualice el constructor de cliente para crear un GraphServiceClient, en lugar de ActiveDirectoryClient. Los siguientes fragmentos de código suponen que la aplicación usa el AcquireTokenAsyncForUser() método para adquirir nuevos tokens. Puede encontrar una definición para este método como parte del ejemplo active-directory-dotnet-graphapi-console.

    Cambio:

    ActiveDirectoryClient client = new ActiveDirectoryClient(serviceRoot,
    async () => await AcquireTokenAsyncForUser());
    

    Para:

    GraphServiceClient graphClient = new GraphServiceClient(serviceRoot,
       new DelegateAuthenticationProvider(async (requestMessage) => {
          var token = await AcquireTokenAsyncForUser();
          requestMessage.Headers.Authorization = new
             AuthenticationHeaderValue("bearer", token);
       }));
    

    Para la biblioteca cliente de Microsoft Graph, el serviceRoot valor también incluye el número de versión. Actualmente, ese valor es https://graph.microsoft.com/v1.0.

  5. Actualice las solicitudes para usar la sintaxis del generador de solicitudes de cliente de Microsoft Graph cambiando:

    signedInUser = (User)await client.Me.ExecuteAsync();
    

    Para:

    signedInUser = (User)await client.Me.Request().GetAsync();
    

    Nota:

    La biblioteca cliente de Graph de Azure AD admite la sintaxis de consulta basada en LINQ. Sin embargo, la biblioteca cliente de Microsoft Graph no lo hace. Por lo tanto, debe convertir las consultas pertinentes en una expresión más RESTful.

    Para ello, cambie:

    var groups = await
    client.Groups.Where(g => g.DisplayName.StartsWith("a")).ExecuteAsync();
    

    Para:

    var groups = await
    client.Groups.Request().Filter("startswith(displayName,'a')").GetAsync();
    
  6. Si las páginas de código a través de colecciones, realice los siguientes ajustes menores. En el ejemplo siguiente se compara y contrasta la captura de un grupo y la paginación a través de sus miembros, 5 a la vez. Aunque el código de Azure AD Graph requiere una construcción de capturador para capturar los miembros de un grupo, Microsoft Graph no tiene ese requisito. Para ser conciso, solo se muestran los miembros del usuario, no se muestran las condiciones try/catch y error, y los fragmentos de código son para una aplicación de consola de un solo subproceso.

    Por ejemplo, cambie el código siguiente mediante la biblioteca cliente de .NET de Azure AD Graph:

    Group retrievedGroup = client.Groups.
        Where(g => g.ObjectId.Equals(id)).ExecuteAsync().Result;
    IGroupFetcher retrievedGroupFetcher = (IGroupFetcher) retrievedGroup;
    
    var membersPage = retrievedGroupFetcher.Members.Take(5).ExecuteAsync().Result;
    Console.WriteLine(" Members:");
    do
    {
        List<IDirectoryObject> members = membersPage.CurrentPage.ToList();
        foreach (IDirectoryObject member in members)
        {
            if (member is User)
            {
                User memberUser = (User)member;
                Console.WriteLine("        User: {0} ", memberUser.DisplayName);
            }
        }
        membersPage = membersPage.GetNextPageAsync().Result;
    } while (membersPage != null);
    
    

    Al código siguiente mediante la biblioteca cliente de .NET de Microsoft Graph:

    var membersPage = client.Groups[id].Members.Request().Top(5).GetAsync().Result;
    Console.WriteLine(" Members:");
    do
    {
        List<DirectoryObject> members = membersPage.CurrentPage.ToList();
        foreach (DirectoryObject member in members)
        {
            if (member is User)
            {
                User memberUser = (User)member;
                Console.WriteLine("        User: {0} ", memberUser.DisplayName);
            }
        }
        if (membersPage.NextPageRequest != null)
            membersPage = membersPage.NextPageRequest.GetAsync().Result;
        else membersPage = null;
    } while (membersPage != null);
    
    
  7. Compile y corrija los errores de acción de recurso, propiedad, navegación y servicio relacionados con los cambios de nombre.

La aplicación de fragmentos de código de consola de C# resalta más de las diferencias entre la biblioteca cliente de Microsoft Graph y la biblioteca cliente de Azure AD Graph.

La biblioteca cliente de Azure AD Graph solo admite la plataforma .NET. Sin embargo, la biblioteca cliente de Microsoft Graph admite plataformas e idiomas adicionales.

Paso siguiente