Migrar o uso da biblioteca de cliente .NET para o Microsoft Graph

Este artigo faz parte da Etapa 3: examinar detalhes do aplicativo na série de lista de verificação de planejamento de migração de aplicativo do Azure AD Graph.

Se o seu aplicativo usa atualmente a biblioteca de cliente do Graph do Azure Active Directory (Azure AD), alterne para a biblioteca de cliente .NET do Microsoft Graph.

Neste artigo, você aprende as seguintes etapas gerais para migrar para a biblioteca de cliente .NET do Microsoft Graph:

  • Como criar um cliente Microsoft Graph, com um token de acesso (que você pode adquirir usando a Biblioteca de Autenticação do Active Directory (ADAL) ou Azure a Biblioteca de Autenticação da Microsoft (MSAL))
  • Como formular solicitações
  • Como usar construtores de consultas
  • Como lidar com coleções e paginação

Visão geral das etapas de migração

As etapas a seguir pressupõem que seu aplicativo use a ADAL para adquirir tokens de acesso para chamar o Azure AD Graph. A alternância para a MSAL pode ser feita como uma etapa separada descrita na migração para a MSAL.

Atualizar a URL do recurso

Para adquirir um token de acesso ao Microsoft Graph, atualize resourceUrl

De:

https://graph.windows.net

Para:

https://graph.microsoft.com

Referências de atualização

Em seu aplicativo, atualize as referências à biblioteca de clientes do Microsoft Graph alterando:

De:

using Microsoft.Azure.ActiveDirectory.GraphClient;

Para:

using Microsoft.Graph;

Pacotes de atualização e dependências

Use o gerenciador de pacotes para baixar e atualizar o pacote NuGet do Microsoft Graph e atualizar as dependências.

Atualizar construtor do cliente

Atualize o construtor do cliente para criar um GraphServiceClient em vez de ActiveDirectoryClient. Os snippets de código a seguir pressupõem que seu aplicativo está usando o AcquireTokenAsyncForUser() método para adquirir novos tokens. Você pode encontrar uma definição para esse método como parte do exemplo active-directory-dotnet-graphapi-console.

De:

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 a biblioteca de cliente do Microsoft Graph, o serviceRoot valor também inclui o número da versão. Atualmente, esse valor é https://graph.microsoft.com/v1.0.

Sintaxes de solicitação de atualização

Atualize as solicitações para usar a sintaxe do construtor de solicitações do cliente Microsoft Graph, alterando:

De:

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

Para:

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

A biblioteca de cliente do Azure AD Graph dava suporte à sintaxe de consulta baseada em LINQ. No entanto, a biblioteca de clientes do Microsoft Graph não. Consequentemente, você precisa converter as consultas relevantes em uma expressão mais RESTful. Para fazer isso, altere:

De:

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

Para:

var groups = await
client.Groups.Request().Filter("startswith(displayName,'a')").GetAsync();

Lidar com coleções e paginação

Se suas páginas de código por meio de coleções, ajustes serão necessários. O exemplo a seguir compara e contrasta a busca de um grupo e a paginação por meio de seus membros, cinco por vez. Embora o código do Azure AD Graph exija uma construção de buscador para buscar os membros de um grupo, o Microsoft Graph não tem esse requisito. O código é trucado e mostra apenas membros do usuário, as condições de tentativa/captura e erro não são mostradas e os trechos de código são para um aplicativo de console de thread único.

Como exemplo, altere o seguinte código usando a biblioteca de clientes .NET do 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);

Para o seguinte código usando a biblioteca de cliente .NET do 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);

Testar, validar, resolver

Crie e corrija quaisquer erros de recurso, propriedade, navegação e ação de serviço relacionados a alterações de nome.

Recursos

  • O aplicativo de trechos de console do C# realça mais das diferenças entre a biblioteca de clientes do Microsoft Graph e a biblioteca de clientes do Azure AD Graph.
  • A biblioteca de clientes do Graph do Azure AD dá suporte apenas à plataforma .NET. No entanto, a biblioteca de cliente do Microsoft Graph dá suporte a plataformas e idiomas adicionais.

Próxima etapa