Tutorial: Chamar a API do Microsoft Graph a partir de um aplicativo da Plataforma Universal do Windows (UWP)
Neste tutorial, você cria um aplicativo nativo da Plataforma Universal do Windows (UWP) que entra nos usuários e obtém um token de acesso para chamar a API do Microsoft Graph.
No final deste guia, seu aplicativo chama uma API protegida usando contas pessoais. Exemplos são outlook.com, live.com e outros. Seu aplicativo também chama contas corporativas e de estudante de qualquer empresa ou organização que tenha o Microsoft Entra ID.
Neste tutorial:
- Criar um projeto da Plataforma Universal do Windows (UWP) no Visual Studio
- Registrar o aplicativo no portal do Azure
- Adicionar código para dar suporte ao login e logout do usuário
- Adicionar código para chamar a API do Microsoft Graph
- Testar a aplicação
Pré-requisitos
- Visual Studio 2019 com a carga de trabalho de desenvolvimento da Plataforma Universal do Windows instalada
Como funciona este guia
Este guia cria um aplicativo UWP de exemplo que consulta a API do Microsoft Graph. Para esse cenário, um token é adicionado a solicitações HTTP usando o cabeçalho Authorization. A Biblioteca de Autenticação da Microsoft lida com aquisições e renovações de tokens.
Pacotes NuGet
Este guia usa o seguinte pacote NuGet:
Biblioteca | Description |
---|---|
Microsoft.Identity.Client | Biblioteca de autenticação do Microsoft |
Microsoft.Graph | Biblioteca de cliente do Microsoft Graph |
Configure o seu projeto
Esta seção fornece instruções passo a passo para integrar um aplicativo .NET da Área de Trabalho do Windows (XAML) com a entrada com a Microsoft. Em seguida, o aplicativo pode consultar APIs da Web que exigem um token, como a API do Microsoft Graph.
Este guia cria um aplicativo que exibe um botão que consulta a API do Microsoft Graph e um botão para sair. Ele também exibe caixas de texto que contêm os resultados das chamadas.
Gorjeta
Para ver uma versão completa do projeto que você cria neste tutorial, você pode baixá-lo do GitHub.
Criar a sua aplicação
Abra o Visual Studio e selecione Criar um novo projeto.
Em Criar um novo projeto, escolha Aplicativo em Branco (Universal Windows) para C# e selecione Avançar.
Em Configurar seu novo projeto, nomeie o aplicativo e selecione Criar.
Se solicitado, em Novo Projeto da Plataforma Universal do Windows, selecione qualquer versão para as versões Destino e Mínima e selecione OK.
Adicionar a Biblioteca de Autenticação da Microsoft ao seu projeto
No Visual Studio, selecione Ferramentas>Gestor de pacote NuGet>Consola do Gestor de Pacotes.
Copie e cole os seguintes comandos na janela Console do Gerenciador de Pacotes:
Install-Package Microsoft.Identity.Client Install-Package Microsoft.Graph
Nota
O primeiro comando instala a Biblioteca de Autenticação da Microsoft (MSAL.NET). MSAL.NET adquire, armazena em cache e atualiza tokens de usuário que acessam APIs protegidas pela plataforma de identidade da Microsoft. O segundo comando instala o Microsoft Graph .NET Client Library para autenticar solicitações para o Microsoft Graph e fazer chamadas para o serviço.
Crie a interface do usuário do seu aplicativo
O Visual Studio cria MainPage.xaml como parte do seu modelo de projeto. Abra este ficheiro e, em seguida, substitua o nó Grid da aplicação pelo seguinte código:
<Grid>
<StackPanel Background="Azure">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button x:Name="CallGraphButton" Content="Call Microsoft Graph API" HorizontalAlignment="Right" Padding="5" Click="CallGraphButton_Click" Margin="5" FontFamily="Segoe Ui"/>
<Button x:Name="SignOutButton" Content="Sign-Out" HorizontalAlignment="Right" Padding="5" Click="SignOutButton_Click" Margin="5" Visibility="Collapsed" FontFamily="Segoe Ui"/>
</StackPanel>
<TextBlock Text="API Call Results" Margin="2,0,0,-5" FontFamily="Segoe Ui" />
<TextBox x:Name="ResultText" TextWrapping="Wrap" MinHeight="120" Margin="5" FontFamily="Segoe Ui"/>
<TextBlock Text="Token Info" Margin="2,0,0,-5" FontFamily="Segoe Ui" />
<TextBox x:Name="TokenInfoText" TextWrapping="Wrap" MinHeight="70" Margin="5" FontFamily="Segoe Ui"/>
</StackPanel>
</Grid>
Usar a Biblioteca de Autenticação da Microsoft para obter um token para a API do Microsoft Graph
Esta seção mostra como usar a Biblioteca de Autenticação da Microsoft para obter um token para a API do Microsoft Graph. Faça alterações no arquivo MainPage.xaml.cs arquivo.
Em MainPage.xaml.cs, adicione as seguintes referências:
using Microsoft.Identity.Client; using Microsoft.Graph; using Microsoft.Graph.Models; using System.Diagnostics; using System.Threading.Tasks; using System.Net.Http.Headers;
Substitua sua
MainPage
classe pelo seguinte código:public sealed partial class MainPage : Page { //Set the scope for API call to user.read private string[] scopes = new string[] { "user.read" }; // Below are the clientId (Application Id) of your app registration and the tenant information. // You have to replace: // - the content of ClientID with the Application Id for your app registration private const string ClientId = "[Application Id pasted from the application registration portal]"; private const string Tenant = "common"; // Alternatively "[Enter your tenant, as obtained from the Azure portal, e.g. kko365.onmicrosoft.com]" private const string Authority = "https://login.microsoftonline.com/" + Tenant; // The MSAL Public client app private static IPublicClientApplication PublicClientApp; private static string MSGraphURL = "https://graph.microsoft.com/v1.0/"; private static AuthenticationResult authResult; public MainPage() { this.InitializeComponent(); } /// <summary> /// Call AcquireTokenAsync - to acquire a token requiring user to sign in /// </summary> private async void CallGraphButton_Click(object sender, RoutedEventArgs e) { try { // Sign in user using MSAL and obtain an access token for Microsoft Graph GraphServiceClient graphClient = await SignInAndInitializeGraphServiceClient(scopes); // Call the /me endpoint of Graph User graphUser = await graphClient.Me.GetAsync(); // Go back to the UI thread to make changes to the UI await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { ResultText.Text = "Display Name: " + graphUser.DisplayName + "\nBusiness Phone: " + graphUser.BusinessPhones.FirstOrDefault() + "\nGiven Name: " + graphUser.GivenName + "\nid: " + graphUser.Id + "\nUser Principal Name: " + graphUser.UserPrincipalName; DisplayBasicTokenInfo(authResult); this.SignOutButton.Visibility = Visibility.Visible; }); } catch (MsalException msalEx) { await DisplayMessageAsync($"Error Acquiring Token:{System.Environment.NewLine}{msalEx}"); } catch (Exception ex) { await DisplayMessageAsync($"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}"); return; } } /// <summary> /// Signs in the user and obtains an access token for Microsoft Graph /// </summary> /// <param name="scopes"></param> /// <returns> Access Token</returns> private static async Task<string> SignInUserAndGetTokenUsingMSAL(string[] scopes) { // Initialize the MSAL library by building a public client application PublicClientApp = PublicClientApplicationBuilder.Create(ClientId) .WithAuthority(Authority) .WithUseCorporateNetwork(false) .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient") .WithLogging((level, message, containsPii) => { Debug.WriteLine($"MSAL: {level} {message} "); }, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true) .Build(); // It's good practice to not do work on the UI thread, so use ConfigureAwait(false) whenever possible. IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false); IAccount firstAccount = accounts.FirstOrDefault(); try { authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount) .ExecuteAsync(); } catch (MsalUiRequiredException ex) { // A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token Debug.WriteLine($"MsalUiRequiredException: {ex.Message}"); authResult = await PublicClientApp.AcquireTokenInteractive(scopes) .ExecuteAsync() .ConfigureAwait(false); } return authResult.AccessToken; } }
Obter um token de usuário interativamente
O AcquireTokenInteractive
método resulta em uma janela que solicita que os usuários entrem. Os aplicativos geralmente exigem que os usuários entrem interativamente na primeira vez para acessar um recurso protegido. Eles também podem precisar entrar quando uma operação silenciosa para adquirir um token falhar. Um exemplo é quando a senha de um usuário expirou.
Obter um token de utilizador automaticamente
O AcquireTokenSilent
método lida com aquisições e renovações de token sem qualquer interação do usuário. Depois de AcquireTokenInteractive
executar pela primeira vez e solicitar credenciais ao usuário, use o AcquireTokenSilent
método para solicitar tokens para chamadas posteriores. Esse método adquire tokens silenciosamente. A Biblioteca de Autenticação da Microsoft lida com o cache e a renovação de tokens.
Eventualmente, o AcquireTokenSilent
método falha. Os motivos para a falha incluem um usuário que saiu ou alterou sua senha em outro dispositivo. Quando a Biblioteca de Autenticação da Microsoft deteta que o problema requer uma ação interativa, ela lança uma MsalUiRequiredException
exceção. Seu aplicativo pode lidar com essa exceção de duas maneiras:
Seu aplicativo liga
AcquireTokenInteractive
imediatamente. Essa chamada resulta em solicitar que o usuário entre. Normalmente, use essa abordagem para aplicativos on-line onde não há conteúdo offline disponível para o usuário. O exemplo gerado por essa configuração guiada segue o padrão. Você o vê em ação na primeira vez que executa o exemplo.Como nenhum usuário usou o aplicativo,
accounts.FirstOrDefault()
contém um valor nulo e lança umaMsalUiRequiredException
exceção.Em seguida, o código no exemplo manipula a exceção chamando
AcquireTokenInteractive
. Essa chamada resulta em solicitar que o usuário entre.Seu aplicativo apresenta uma indicação visual aos usuários de que eles precisam entrar. Em seguida, eles podem selecionar o momento certo para entrar. O aplicativo pode tentar
AcquireTokenSilent
novamente mais tarde. Use essa abordagem quando os usuários puderem usar outras funcionalidades do aplicativo sem interrupção. Um exemplo é quando o conteúdo offline está disponível no aplicativo. Nesse caso, os usuários podem decidir quando querem entrar. O aplicativo pode tentarAcquireTokenSilent
novamente depois que a rede ficou temporariamente indisponível.
Instancie o cliente de serviço do Microsoft Graph obtendo o token do método SignInUserAndGetTokenUsingMSAL
No projeto, crie um novo arquivo chamado TokenProvider.cs: clique com o botão direito do mouse no projeto, selecione Adicionar>Nova Página em Branco de Item>.
Adicione ao arquivo recém-criado o seguinte código:
using Microsoft.Kiota.Abstractions.Authentication;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace UWP_app_MSGraph {
public class TokenProvider : IAccessTokenProvider {
private Func<string[], Task<string>> getTokenDelegate;
private string[] scopes;
public TokenProvider(Func<string[], Task<string>> getTokenDelegate, string[] scopes) {
this.getTokenDelegate = getTokenDelegate;
this.scopes = scopes;
}
public Task<string> GetAuthorizationTokenAsync(Uri uri, Dictionary<string, object> additionalAuthenticationContext = default,
CancellationToken cancellationToken = default) {
return getTokenDelegate(scopes);
}
public AllowedHostsValidator AllowedHostsValidator { get; }
}
}
Gorjeta
Depois de colar o código, certifique-se de que o namespace no arquivo TokenProvider.cs corresponde ao namespace do seu projeto. Isso permitirá que você faça referência mais facilmente à TokenProvider
classe em seu projeto.
A TokenProvider
classe define um provedor de token de acesso personalizado que executa o método de delegado especificado para obter e retornar um token de acesso.
Adicione o seguinte novo método a MainPage.xaml.cs:
/// <summary>
/// Sign in user using MSAL and obtain a token for Microsoft Graph
/// </summary>
/// <returns>GraphServiceClient</returns>
private async static Task<GraphServiceClient> SignInAndInitializeGraphServiceClient(string[] scopes)
{
var tokenProvider = new TokenProvider(SignInUserAndGetTokenUsingMSAL, scopes);
var authProvider = new BaseBearerTokenAuthenticationProvider(tokenProvider);
var graphClient = new GraphServiceClient(authProvider, MSGraphURL);
return await Task.FromResult(graphClient);
}
Nesse método, você está usando o provedor de TokenProvider
token de acesso personalizado para conectar o SignInUserAndGetTokenUsingMSAL
método ao SDK do Microsoft Graph .NET e criar um cliente autenticado.
Para usar o BaseBearerTokenAuthenticationProvider
arquivo , no arquivo MainPage.xaml.cs, adicione a seguinte referência:
using Microsoft.Kiota.Abstractions.Authentication;
Mais informações sobre como fazer uma chamada REST em relação a uma API protegida
Neste aplicativo de exemplo, o GetGraphServiceClient
método instancia GraphServiceClient
usando um token de acesso. Em seguida, GraphServiceClient
é usado para obter as informações de perfil do usuário do ponto de extremidade me .
Adicionar um método para sair do usuário
Para sair do usuário, adicione o seguinte método a MainPage.xaml.cs:
/// <summary>
/// Sign out the current user
/// </summary>
private async void SignOutButton_Click(object sender, RoutedEventArgs e)
{
IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false);
IAccount firstAccount = accounts.FirstOrDefault();
try
{
await PublicClientApp.RemoveAsync(firstAccount).ConfigureAwait(false);
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
ResultText.Text = "User has signed out";
this.CallGraphButton.Visibility = Visibility.Visible;
this.SignOutButton.Visibility = Visibility.Collapsed;
});
}
catch (MsalException ex)
{
ResultText.Text = $"Error signing out user: {ex.Message}";
}
}
MSAL.NET usa métodos assíncronos para adquirir tokens ou manipular contas. Como tal, ofereça suporte a ações da interface do usuário no thread da interface do usuário. Esta é a razão para a Dispatcher.RunAsync
chamada e as precauções para chamar ConfigureAwait(false)
.
Mais informações sobre como sair
O SignOutButton_Click
método remove o usuário do cache de usuário da Biblioteca de Autenticação da Microsoft. Esse método efetivamente diz à Biblioteca de Autenticação da Microsoft para esquecer o usuário atual. Uma solicitação futura para adquirir um token só será bem-sucedida se for interativa.
O aplicativo neste exemplo oferece suporte a um único usuário. A Biblioteca de Autenticação da Microsoft suporta cenários em que o utilizador pode iniciar sessão em mais do que uma conta. Um exemplo é um aplicativo de e-mail onde um usuário tem várias contas.
Exibir informações básicas do token
Adicione o seguinte método a MainPage.xaml.cs para exibir informações básicas sobre o token:
/// <summary>
/// Display basic information contained in the token. Needs to be called from the UI thread.
/// </summary>
private void DisplayBasicTokenInfo(AuthenticationResult authResult)
{
TokenInfoText.Text = "";
if (authResult != null)
{
TokenInfoText.Text += $"User Name: {authResult.Account.Username}" + Environment.NewLine;
TokenInfoText.Text += $"Token Expires: {authResult.ExpiresOn.ToLocalTime()}" + Environment.NewLine;
}
}
Mais informações
Os tokens de ID adquiridos usando o OpenID Connect também contêm um pequeno subconjunto de informações pertinentes ao usuário. DisplayBasicTokenInfo
Exibe informações básicas contidas no token. Essas informações incluem o nome de exibição e o ID do usuário. Ele também inclui a data de expiração do token e a cadeia de caracteres que representa o próprio token de acesso. Se você selecionar o botão Chamar a API do Microsoft Graph várias vezes, verá que o mesmo token foi reutilizado para solicitações posteriores. Você também pode ver a data de expiração estendida quando a Biblioteca de Autenticação da Microsoft decidir que é hora de renovar o token.
Apresentar mensagem
Adicione o seguinte novo método a MainPage.xaml.cs:
/// <summary>
/// Displays a message in the ResultText. Can be called from any thread.
/// </summary>
private async Task DisplayMessageAsync(string message)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
() =>
{
ResultText.Text = message;
});
}
Registar a aplicação
Gorjeta
As etapas neste artigo podem variar ligeiramente com base no portal a partir do qual você começou.
Agora, registe a sua candidatura:
- Entre no centro de administração do Microsoft Entra como pelo menos um desenvolvedor de aplicativos.
- Se você tiver acesso a vários locatários, use o ícone Configurações no menu superior para alternar para o locatário no qual deseja registrar o aplicativo no menu Diretórios + assinaturas.
- Navegue até Registros do aplicativo Identity>Applications>.
- Selecione Novo registo.
- Introduza um Nome para a sua aplicação, por exemplo
UWP-App-calling-MSGraph
. Os usuários do seu aplicativo podem ver esse nome e você pode alterá-lo mais tarde. - Em Tipos de conta suportados, selecione Contas em qualquer diretório organizacional (Qualquer diretório Microsoft Entra - Multilocatário) e contas pessoais da Microsoft (por exemplo, Skype, Xbox).
- Selecione Registar.
- Na página de visão geral, localize o valor da ID do aplicativo (cliente) e copie-o. Volte para o Visual Studio, abra MainPage.xaml.cs e substitua o valor de
ClientId
por esse valor.
Configure a autenticação para seu aplicativo:
- No centro de administração do Microsoft Entra, selecione Autenticação>Adicionar uma plataforma e, em seguida, selecione Aplicações móveis e de ambiente de trabalho.
- Na seção Redirecionar URIs, digite
https://login.microsoftonline.com/common/oauth2/nativeclient
. - Selecione Configurar.
Configure permissões de API para seu aplicativo:
- Selecione Permissões de API>Adicionar uma permissão.
- Selecione Microsoft Graph.
- Selecione Permissões delegadas, procure User.Read e verifique se User.Read está selecionado.
- Se você fez alterações, selecione Adicionar permissões para salvá-las.
Habilitar autenticação integrada em domínios federados (opcional)
Para habilitar a autenticação integrada do Windows quando ela é usada com um domínio federado do Microsoft Entra, o manifesto do aplicativo deve habilitar recursos adicionais. Volte para seu aplicativo no Visual Studio.
Abra Package.appxmanifest.
Selecione Recursos e habilite as seguintes configurações:
- Autenticação Empresarial
- Redes Privadas (Cliente & Servidor)
- Certificados de usuário compartilhados
Importante
A autenticação integrada do Windows não está configurada por padrão para este exemplo. Aplicativos que solicitam Enterprise Authentication
ou Shared User Certificates
recursos exigem um nível mais alto de verificação pela Windows Store. Além disso, nem todos os desenvolvedores querem executar o nível mais alto de verificação. Habilite essa configuração somente se precisar de autenticação integrada do Windows com um domínio federado do Microsoft Entra.
Abordagem alternativa para usar WithDefaultRedirectURI()
Na amostra atual, o WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
método é usado. Para usar WithDefaultRedirectURI()
o , conclua estas etapas:
Em MainPage.XAML.cs, substitua
WithRedirectUri
porWithDefaultRedirectUri
:Código atual
PublicClientApp = PublicClientApplicationBuilder.Create(ClientId) .WithAuthority(Authority) .WithUseCorporateNetwork(false) .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient") .WithLogging((level, message, containsPii) => { Debug.WriteLine($"MSAL: {level} {message} "); }, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true) .Build();
Código atualizado
PublicClientApp = PublicClientApplicationBuilder.Create(ClientId) .WithAuthority("https://login.microsoftonline.com/common") .WithUseCorporateNetwork(false) .WithDefaultRedirectUri() .WithLogging((level, message, containsPii) => { Debug.WriteLine($"MSAL: {level} {message} "); }, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true) .Build();
Encontre o URI de retorno de chamada do seu aplicativo adicionando o
redirectURI
campo em MainPage.xaml.cs e definindo um ponto de interrupção nele:public sealed partial class MainPage : Page { ... string redirectURI = Windows.Security.Authentication.Web.WebAuthenticationBroker .GetCurrentApplicationCallbackUri().ToString(); public MainPage() { ... } ... }
Execute o aplicativo e copie o valor de quando o ponto de
redirectUri
interrupção for atingido. O valor deve ser semelhante ao seguinte valor:ms-app://s-1-15-2-1352796503-54529114-405753024-3540103335-3203256200-511895534-1429095407/
Em seguida, você pode remover a linha de código porque ela é necessária apenas uma vez para buscar o valor.
No centro de administração do Microsoft Entra, adicione o valor retornado em RedirectUri no painel Autenticação .
Teste o seu código
Para testar seu aplicativo, selecione a tecla F5 para executar seu projeto no Visual Studio. A janela principal aparece:
Quando estiver pronto para testar, selecione Chamar API do Microsoft Graph. Em seguida, use uma conta organizacional do Microsoft Entra ou uma conta da Microsoft, como live.com ou outlook.com, para entrar. Na primeira vez que um usuário executa esse teste, o aplicativo exibe uma janela solicitando que o usuário entre.
Consentimento
Na primeira vez que iniciar sessão na sua aplicação, é apresentado um ecrã de consentimento semelhante à imagem seguinte. Selecione Sim para consentir explicitamente o acesso:
Resultados esperados
Você vê as informações de perfil de usuário retornadas pela chamada da API do Microsoft Graph na tela Resultados da chamada de API:
Você também vê informações básicas sobre o token adquirido via AcquireTokenInteractive
ou AcquireTokenSilent
na caixa Informações do token :
Property | Formato | Description |
---|---|---|
Username |
user@domain.com |
O nome de usuário que identifica o usuário. |
Token Expires |
DateTime |
A hora em que o token expira. A Biblioteca de Autenticação da Microsoft estende a data de expiração renovando o token conforme necessário. |
Mais informações sobre escopos e permissões delegadas
A API do Microsoft Graph requer o escopo para ler o user.read
perfil de um usuário. Esse escopo é adicionado por padrão em todos os aplicativos registrados no Portal de Registro de Aplicativos. Outras APIs para o Microsoft Graph e APIs personalizadas para seu servidor back-end podem exigir escopos adicionais. Por exemplo, a API do Microsoft Graph requer o Calendars.Read
escopo para listar os calendários do usuário.
Para acessar os calendários do usuário no contexto de um aplicativo, adicione a Calendars.Read
permissão delegada às informações de registro do aplicativo. Em seguida, adicione o Calendars.Read
escopo à acquireTokenSilent
chamada.
Os usuários podem ser solicitados a fornecer consentimentos adicionais à medida que você aumenta o número de escopos.
Problemas conhecidos
Problema 1
Recebe uma das seguintes mensagens de erro quando inicia sessão na sua aplicação num domínio federado do Microsoft Entra:
- "Nenhum certificado de cliente válido encontrado na solicitação."
- "Nenhum certificado válido encontrado no armazenamento de certificados do usuário."
- "Tente novamente escolher um método de autenticação diferente."
Causa: os recursos empresariais e de certificado não estão habilitados.
Solução: siga as etapas em Habilitar autenticação integrada em domínios federados (opcional).
Problema 2
Você habilita a autenticação integrada em domínios federados e tenta usar o Windows Hello em um computador com Windows 10 para entrar em um ambiente com autenticação multifator configurada. A lista de certificados é exibida. Se optar por utilizar o PIN, a janela PIN nunca é apresentada.
Causa: esse problema é uma limitação conhecida do agente de autenticação da Web em aplicativos UWP executados em desktops Windows 10. Ele funciona bem no Windows 10 Mobile.
Solução alternativa: selecione Entrar com outras opções. Em seguida, selecione Entrar com um nome de usuário e senha. Selecione Forneça sua senha. Em seguida, passe pelo processo de autenticação do telefone.
Ajuda e suporte
Se precisar de ajuda, quiser comunicar um problema ou quiser saber mais sobre as suas opções de suporte, consulte Ajuda e suporte para programadores.
Próximos passos
Saiba mais sobre como usar a Microsoft Authentication Library (MSAL) para autorização e autenticação em aplicativos .NET: