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.
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.
Faça o registro ou utilize um aplicativo do AD de interesse e acesse a página de permissões da API.
Na tela de permissões, acesse a aba para adicionar novas permissões.
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.
Para concluir, conceda o consentimento de administrador para as permissões adicionadas.
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.
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.