Codeblox Blog

Atualizando usuários no Azure AD com Microsoft Graph

Thomaz
25/10/2021

A tarefa de gravar informações de usuários no Azure AD (Active Directory) por meio de um backend ou daemon pode parecer trivial em um primeiro momento. No entanto é necessário prestar atenção nas permissões necessárias para viabilizá-la.

O cenário


Recentemente lidamos com a necessidade de atualizar informações de usuários no Azure AD, porém o processo deveria acontecer de forma automatizada. Ou seja, um serviço ou gatilho de backend seria o responsável por essa ação.

Para atender esse cenário, é possível utilizar a solução descrita abaixo.

1 Crie ou utilize um aplicativo registrado no Active Directory


Faça o registro ou utilize um aplicativo do AD de interesse e acesse a página de permissões da API.

image

Na tela de permissões, acesse a aba para adicionar novas permissões.

image

Como o objetivo é possibilitar que um serviço realize as operações, adicione as permissões necessárias de aplicativo do Microsoft Graph para atender o seu cenário.

ms_graph_application_permissions

Para concluir, conceda o consentimento de administrador para as permissões adicionadas.

image

2 Adicione um certificado ou segredo do cliente


Para que o serviço possa solicitar um token de acesso à API do Microsoft Graph, deve ser criado um certificado ou segredo do cliente. Para maior segurança, utilize a primeira opção. No nosso exemplo utilizaremos o client secret: durante a sua criação escolha uma descrição e validade. Após criá-lo, registre o Value gerado para uso posterior.

image

3 Consuma as API’s do Microsoft Graph com bibliotecas .NET


Utilizando as bibliotecas Microsoft.Graph e Microsoft.Identity.Client é possível construir uma classe que poderá realizar as operações desejadas.

Utilizando as dependências adequadamente instaladas e referenciadas:

using Microsoft.Graph;
using Microsoft.Identity.Client;


Obtemos então um ConfidentialClientApplication, utilizando os parâmetros Application (client) ID e Directory (tenant) ID do passo 1 (respectivamente _clientId e _tenantId) e o _clientSecret, que é o Value gerado no passo 2.

var app = ConfidentialClientApplicationBuilder.Create(_clientId)
        .WithClientSecret(_clientSecret)
        .WithAuthority(new Uri($"https://login.microsoftonline.com/{_tenantId}"))
        .Build();


Com ele é possível obter o token para fazer requisições nas APIs do Microsoft Graph. Note que apenas um escopo é solicitado. Ele também possui o sufixo .default, pois estamos trabalhando com um aplicativo que utiliza permissões do tipo application. Ou seja, as permissões são definidas de forma “estática”.

string[] scopes = new string[] { "https://graph.microsoft.com/.default" };


Com o escopo configurado, conseguimos obter então o AuthenticationResult, que deverá retornar o AccessToken se tudo estiver configurado corretamente

AuthenticationResult result = null;
result = await app.AcquireTokenForClient(scopes)
        .ExecuteAsync();


Gere uma instância do GraphServiceClient com o resultado de autenticação obtido.

var graphServiceClient = 
        new GraphServiceClient(
                new DelegateAuthenticationProvider(
                        (requestMessage) => {
                                                requestMessage
                                                    .Headers
                                                    .Authorization = 
                                                        new AuthenticationHeaderValue("Bearer", result.AccessToken);
                                                return Task.CompletedTask;
                                            }
                )
        );


Agora você pode utilizá-lo para alterar as informações dos usuários. No exemplo abaixo o campo “OtherMails” é sobrescrito pelo email teste@emailqualquer.com. Utilize a documentação oficial para descobrir quais outros campos você pode atualizar.

var list = await graphServiceClient
                .Users
                .Request()
                .Select(x => new { x.Id, x.UserPrincipalName, x.OtherMails })
                .GetAsync();

var user = list.Where(u => u.UserPrincipalName == userPrincipalName).FirstOrDefault();
user.OtherMails = new List<string>() { "teste@emailqualquer.com" };
await graphServiceClient.Users[user.Id].Request().UpdateAsync(user);


Para aprender mais sobre o SDK do Graph, veja o overview disponibilizado pela Microsoft.

azure
cloud
backend
microsoft graph


Thomaz Saito
Thomaz Saito
Desenvolvedor fullstack .Net/Angular/Azure/GitHub