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}/
, dovetenant
è 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.
- Con tenant nel formato
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 una API Web dall'applicazione desktop.