App desktop che chiama le API Web: acquisire un token usando autenticazione di Windows integrato

Per accedere a un utente di dominio in un dominio o in un computer aggiunto a Microsoft Entra, usare autenticazione di Windows integrato (IWA).

Vincoli

  • La autenticazione di Windows integrata è disponibile solo per gli utenti federati+, ovvero gli utenti creati in Active Directory e supportati da Microsoft Entra ID. Gli utenti creati direttamente in Microsoft Entra ID senza supporto di Active Directory, noti come utenti gestiti , non possono usare questo flusso di autenticazione. Questa limitazione non influisce sul flusso di nome utente e password.

  • L'autenticazione a più fattori (MFA) non viene ignorata. Se è configurata l'autenticazione a più fattori, l'autenticazione integrata di Windows potrebbe avere esito negativo se è necessaria una richiesta di verifica di autenticazione a più fattori, in quanto richiede l'interazione dell'utente.

    L'autenticazione integrata di Windows è non interattiva, ma l'autenticazione a più fattori richiede l'interattività dell'utente. L'utente non controlla quando il provider di identità richiede l'esecuzione dell'autenticazione a più fattori. Questa operazione viene gestita dall'amministratore del tenant. In base a quanto osservato, l'autenticazione a più fattori è necessaria quando si accede da un paese o un'area geografica diversa, quando non si è connessi tramite VPN a una rete aziendale e talvolta anche quando si è connessi tramite VPN. Non è previsto un set di regole deterministico. Microsoft Entra ID usa l'intelligenza artificiale per apprendere continuamente se è necessaria l'autenticazione a più fattori. Eseguire il fallback a una richiesta utente come l'autenticazione interattiva o il flusso del codice del dispositivo in caso di errore dell'autenticazione integrata di Windows.

  • L'autorità passata in PublicClientApplicationBuilder deve essere:

    • Con tenant nel formato https://login.microsoftonline.com/{tenant}/, dove tenant è il GUID che rappresenta l'ID tenant o un dominio associato al tenant.
    • Per gli account aziendali e dell'istituto di istruzione: https://login.microsoftonline.com/organizations/.
    • Gli account Microsoft personali non sono supportati. Non è possibile usare i tenant /common o /consumers.
  • Poiché la autenticazione di Windows integrata è un flusso invisibile all'utente:

    • L'utente dell'applicazione deve avere precedentemente acconsentito all'uso dell'applicazione.
    • In alternativa, l'amministratore del tenant deve avere precedentemente fornito il consenso per l'uso dell'applicazione per tutti gli utenti del tenant.
    • In altre parole:
      • Lo sviluppatore ha selezionato il pulsante Concedi nel portale di Azure per se stesso.
      • In alternativa, un amministratore del tenant ha selezionato Fornisci/Revoca il consenso amministratore per {dominio tenant} nella scheda Autorizzazioni API della registrazione per l'applicazione. Per altre informazioni, vedere Aggiungere autorizzazioni per accedere all'API Web.
      • In alternativa, è stato fornito un modo per consentire agli utenti di fornire il consenso per l'applicazione. Per altre informazioni, vedere Richiesta di consenso per un singolo utente.
      • In alternativa, è stato fornito un modo per consentire all'amministratore del tenant di fornire il consenso per l'applicazione. Per altre informazioni, vedere Consenso amministratore.
  • Questo flusso è abilitato per le app .NET desktop, .NET e UWP.

Per altre informazioni sul consenso, vedere Autorizzazioni e consenso di Microsoft Identity Platform.

Informazioni su come usare l'SDK

In MSAL.NET usare:

AcquireTokenByIntegratedWindowsAuth(IEnumerable<string> scopes)

In genere è necessario un solo parametro (scopes). A seconda del modo in cui l'amministratore di Windows ha configurato i criteri, è possibile che le applicazioni nel computer Windows non siano autorizzate a cercare l'utente che ha eseguito l'accesso. In tal caso, usare un secondo metodo, .WithUsername()e passare il nome utente dell'utente che ha eseguito l'accesso come formato UPN, ad esempio joe@contoso.com.

Nell'esempio seguente viene presentato il caso più recente, con spiegazioni sulle possibili tipologie di eccezioni restituite e sulle relative mitigazioni.

static async Task GetATokenForGraph()
{
 string authority = "https://login.microsoftonline.com/contoso.com";
 string[] scopes = new string[] { "user.read" };
 IPublicClientApplication app = PublicClientApplicationBuilder
      .Create(clientId)
      .WithAuthority(authority)
      .Build();

 var accounts = await app.GetAccountsAsync();

 AuthenticationResult result = null;
 if (accounts.Any())
 {
  result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
      .ExecuteAsync();
 }
 else
 {
  try
  {
   result = await app.AcquireTokenByIntegratedWindowsAuth(scopes)
      .ExecuteAsync(CancellationToken.None);
  }
  catch (MsalUiRequiredException ex)
  {
   // MsalUiRequiredException: AADSTS65001: The user or administrator has not consented to use the application
   // with ID '{appId}' named '{appName}'.Send an interactive authorization request for this user and resource.

   // you need to get user consent first. This can be done, if you are not using .NET (which does not have any Web UI)
   // by doing (once only) an AcquireToken interactive.

   // If you are using .NET or don't want to do an AcquireTokenInteractive, you might want to suggest the user to navigate
   // to a URL to consent: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={clientId}&response_type=code&scope=user.read

   // AADSTS50079: The user is required to use multi-factor authentication.
   // There is no mitigation - if MFA is configured for your tenant and AAD decides to enforce it,
   // you need to fallback to an interactive flows such as AcquireTokenInteractive or AcquireTokenByDeviceCode
   }
   catch (MsalServiceException ex)
   {
    // Kind of errors you could have (in ex.Message)

    // MsalServiceException: AADSTS90010: The grant type is not supported over the /common or /consumers endpoints. Please use the /organizations or tenant-specific endpoint.
    // you used common.
    // Mitigation: as explained in the message from Azure AD, the authority needs to be tenanted or otherwise organizations

    // MsalServiceException: AADSTS70002: The request body must contain the following parameter: 'client_secret or client_assertion'.
    // Explanation: this can happen if your application was not registered as a public client application in Azure AD
    // Mitigation: in the Azure portal, edit the manifest for your application and set the `allowPublicClient` to `true`
   }
   catch (MsalClientException ex)
   {
      // Error Code: unknown_user Message: Could not identify logged in user
      // Explanation: the library was unable to query the current Windows logged-in user or this user is not AD or AAD
      // joined (work-place joined users are not supported).

      // Mitigation 1: on UWP, check that the application has the following capabilities: Enterprise Authentication,
      // Private Networks (Client and Server), User Account Information

      // Mitigation 2: Implement your own logic to fetch the username (e.g. john@contoso.com) and use the
      // AcquireTokenByIntegratedWindowsAuth form that takes in the username

      // Error Code: integrated_windows_auth_not_supported_managed_user
      // Explanation: This method relies on a protocol exposed by Active Directory (AD). If a user was created in Azure
      // Active Directory without AD backing ("managed" user), this method will fail. Users created in AD and backed by
      // AAD ("federated" users) can benefit from this non-interactive method of authentication.
      // Mitigation: Use interactive authentication
   }
 }

 Console.WriteLine(result.Account.Username);
}

Per l'elenco dei modificatori possibili in AcquireTokenByIntegratedWindowsAuthentication, vedere AcquireTokenByIntegratedWindowsAuthParameterBuilder.

Passaggi successivi

Passare all'articolo successivo in questo scenario, Chiamare un'API Web dall'app desktop.