Autenticazione in Microsoft Dataverse con OAuth
Microsoft Dataverse usa OAuth 2.0 come standard di autenticazione. OAuth 2.0 fornisce uno standard del settore per eseguire l'autenticazione delle applicazioni client e concedere a esse l'accesso a una risorsa.
Autenticazione e autorizzazione
L'autenticazione è il processo o l'azione di verifica dell'identità di un utente o di un processo. La soluzione Microsoft per questo processo di verifica è Microsoft Entra ID. Entra ID supporta molte opzioni per verificare l'identità di un utente o di un processo. Il ricorso a un provider di identità consente di alleggerire il carico di lavoro perché la gestione di nomi utente e password può essere un processo difficile (e rischioso).
Nota
Microsoft Entra ID è il nuovo nome di Azure Active Directory. Tutte le licenze e le funzionalità rimangono le stesse.
L'autorizzazione è il processo o l'azione di verificare se un utente autenticato è autorizzato ad accedere alla risorsa. Attualmente l'autorizzazione in Dataverse è a livello del tenant Entra ID, mentre la gestione delle autorizzazioni dettagliate è delegata all'applicazione in base all'utente che ha effettuato l'accesso. Pertanto, non si usa OAuth 2.0 per gestire la sicurezza a livello di app, che si gestirebbe con i ruoli di sicurezza di Dataverse e l'assegnazione agli utenti con l'interfaccia di amministrazione di Power Apps.
Per altre informazioni sui concetti di autenticazione e autorizzazione, vedere Nozioni di base sull'autenticazione.
Registrazione delle app di Dataverse con Entra ID
Per connettersi correttamente a Dataverse, è innanzitutto necessario registrare un'app con Entra ID nel portale di Azure. A seconda del tipo di app da creare, vengono visualizzate impostazioni diverse da configurare (app Web o app native installate su un dispositivo). Per altre informazioni sulle impostazioni necessarie per ogni tipo, vedere Tipi di registrazione dell'app.
Per registrare un'app con Entra ID, andare alla sezione Registrazioni app del menu di Entra ID (Azure Active Directory), quindi selezionare Nuova registrazione.
Specificare il nome dell'app e il tipo di accesso account necessario. Se si sta registrando un'app Web, specificare un URI di reindirizzamento. A questo scopo accedere alla sezione Autenticazione, impostare il tipo su Web e quindi immettere un URI di reindirizzamento.
Il seguente elenco riepiloga quando usare i diversi tipi di account:
Account solo in questa directory organizzativa (tenant singolo)
Tutti gli account utente e guest nella directory possono usare l'applicazione o l'API.
Usare questa opzione se il gruppo di destinatari è interno all'organizzazione.
Account in qualsiasi directory dell'organizzazione (qualsiasi directory Entra ID - Multitenant)
Tutti gli utenti con un account aziendale o dell'istituto di istruzione di Microsoft possono usare l'applicazione o l'API, comprese le scuole e le aziende che usano Microsoft 365.
Usare questa opzione se il gruppo di destinatari è costituito da clienti aziendali o di istituti di istruzione e per abilitare il multi-tenancy.
Account in qualsiasi directory dell'organizzazione (qualsiasi directory Entra ID - Multitenant) e account Microsoft personali, ad esempio Skype e Xbox
Tutti gli utenti con un account Microsoft aziendale, dell'istituto di istruzione o personale possono usare l'applicazione o l'API. Sono compresi gli istituti di istruzione e le aziende che usano Microsoft 365 e gli account personali usati per accedere a servizi come Xbox e Skype.
A seconda della complessità dell'impostazione dell'applicazione, potrebbe essere necessario configurare altre impostazioni di autenticazione. Fare riferimento alla documentazione di Entra ID per i passaggi su come completare questa attività.
Accesso a Dataverse con l'API Web
Tutti gli accessi a Dataverse vengono eseguiti nel contesto di un utente che ha eseguito l'accesso. Può essere un normale utente interattivo o un utente non interattivo che usa l'autenticazione tra server (S2S).
Quando un'applicazione accede a Dataverse per conto di un utente interattivo, è necessario configurare l'applicazione registrata con le autorizzazioni API per l'accesso a Dataverse con autorizzazione delegata. Quando un'applicazione accede direttamente a Dataverse, è necessario creare un utente dell'applicazione associato alla registrazione dell'applicazione Entra ID in Dataverse. Quando si usa l'autenticazione S2S, le autorizzazioni delegate dell'API Dataverse non sono necessarie.
In tutti i casi, gli utenti autenticati devono disporre di ruoli di sicurezza Dataverse associati all'utente che autorizzano l'esecuzione delle operazioni con l'API Web.
Configurazione delle autorizzazioni API
Se l'applicazione accede a Dataverse per conto di un utente che ha eseguito l'accesso, andare alla scheda Autorizzazioni API nell'applicazione registrata e assicurarsi di concedere all'utente dell'applicazione l'accesso con rappresentazione all'ambiente Dataverse.
Sull'etichetta è riportato Dynamics CRM, che è un nome storico del prodotto precursore di Dataverse.
Configurazione di un utente dell'applicazione Dataverse
Quando si usa l'autenticazione S2S, è necessario configurare un utente dell'applicazione Dataverse in ciascun ambiente Dataverse a cui si accede con l'API Web.
Eseguire la configurazione degli utenti dell'applicazione Dataverse nell'interfaccia di amministrazione di Power Platform come amministratore di sistema.
Dall'interfaccia di amministrazione è possibile effettuare i seguenti passaggi:
Creare un nuovo utente dell'applicazione
Associare l'utente dell'applicazione all'app Entra ID o all'identità gestita
Configurare i ruoli di sicurezza Dataverse applicabili
Per altre informazioni più dettagliate, vedere Gestire gli utenti dell'applicazione nell'interfaccia di amministrazione di Power Platform.
Uso delle librerie di autenticazione per la connessione
Dopo aver registrato l'applicazione, usare una delle librerie di autenticazione della piattaforma di identità Microsoft per eseguire l'autenticazione e acquisire un token di accesso da usare con l'API Web.
Il seguente codice è un estratto dell'esempio di avvio rapido avanzato che usa Microsoft Authentication Library (MSAL). La classe OAuthMessageHandler seguente implementa una classe derivata da DelegatingHandler che si passa al costruttore di HttpClient. Questo gestore consente di sostituire il metodo HttpClient.SendAsync in modo che il token di accesso venga aggiornato dalle chiamate al metodo AcquireToken* con ogni richiesta inviata dal client Http.
class OAuthMessageHandler : DelegatingHandler
{
private AuthenticationHeaderValue authHeader;
public OAuthMessageHandler(string serviceUrl, string clientId, string redirectUrl, string username, string password, HttpMessageHandler innerHandler)
: base(innerHandler)
{
//Build Microsoft.Identity.Client (MSAL) OAuth Token Request
var clientApplication = PublicClientApplicationBuilder.Create(clientId)
.WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs)
.WithRedirectUri(redirectUrl)
.Build();
var scope = serviceUrl + "//.default";
string[] scopes = { scope };
AuthenticationResult authBuilderResult;
if (username != string.Empty && password != string.Empty)
{
//Make silent Microsoft.Identity.Client (MSAL) OAuth Token Request
var securePassword = new SecureString();
foreach (char ch in password) securePassword.AppendChar(ch);
authBuilderResult = clientApplication.AcquireTokenByUsernamePassword(scopes, username, securePassword).ExecuteAsync().Result;
}
else
{
//Popup authentication dialog box to get token
authBuilderResult = clientApplication.AcquireTokenInteractive(scopes).ExecuteAsync().Result;
}
//Note that an Entra ID access token has a finite lifetime, default expiration is 60 minutes.
authHeader = new AuthenticationHeaderValue("Bearer", authBuilderResult.AccessToken);
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
request.Headers.Authorization = authHeader;
return base.SendAsync(request, cancellationToken);
}
}
Si potrebbe quindi disporre di un metodo helper per ottenere l'istanza HttpClient usando il gestore:
static HttpClient GetHttpClient(string url, string clientId, string redirectUrl, string version = "v9.2")
{
try
{
HttpMessageHandler messageHandler = new OAuthMessageHandler(url, clientId, redirectUrl, "", "",
new HttpClientHandler());
HttpClient httpClient = new HttpClient(messageHandler)
{
BaseAddress = new Uri(string.Format("{0}/api/data/{1}/", url, version)),
Timeout = new TimeSpan(0, 2, 0) //2 minutes
};
return httpClient;
}
catch (Exception)
{
throw;
}
}
Infine, usare l'istanza client per effettuare una chiamata API Web:
using (HttpClient client = GetHttpClient("https://yourenvname.api.crm.dynamics.com", "51f81489-12ee-4a9e-aaae-a2591f45987d", "http://localhost:8080"))
{
// Use the WhoAmI function
var response = client.GetAsync("WhoAmI").Result;
if (response.IsSuccessStatusCode)
{
//Get the response content and parse it.
JObject body = JObject.Parse(response.Content.ReadAsStringAsync().Result);
Guid userId = (Guid)body["UserId"];
Console.WriteLine("Your UserId is {0}", userId);
}
else
{
Console.WriteLine("The request failed with a status of '{0}'", response.ReasonPhrase);
}
Console.WriteLine("Press any key to exit.");
Console.ReadLine();
}
Ora si dovrebbe disporre di un'app registrata in grado di connettersi all'ambiente Dataverse. Si dispone inoltre di un semplice esempio di connessione e uso dell'app registrata per accedere a un'operazione dell'API Web.