Nello script #169 abbiamo visto come attivare e usare Azure Active Directory per autenticarci e accedere ad un'istanza di Azure SQL Database. Nell'esempio, utilizziamo infatti SQL Management Studio per effettuare un accesso tramite prompt.
In questo script, invece, mostriamo come sfruttare AAD quando sviluppiamo per poter accedere ad un'istanza remota senza usare delle credenziali. Questo è possibile grazie agli endpoint OAuth messi a disposizione per il rilascio di un token e alla possibilità che l'oggetto SqlConnection ha di accettare un access token. Questa possibilità è presente da .NET Framework 4.7.2 e da .NET Core 2.2 e ci permette di usare stringhe di connessione senza che queste contengano le chiavi user e password. Quando lavoriamo in team possiamo usare quindi utenze diverse e revocarle più facilmente, oltre che a rendere più sicuro l'accesso mediante l'uso di token di breve durata.
Per poter sfruttare questa funzionalità è necessaria la complicità di Visual Studio. Aprendo le opzioni, alla voce Azure Service Authentication, troviamo la selezione dell'account che vogliamo usare per autenticarci verso SQL Database.
In pratica spostiamo il prompt e la selezione dell'account all'interno di Visual Studio per non alterare il nostro applicativo. A questo punto dobbiamo installare il pacchetto NuGet Microsoft.Azure.Services.AppAuthentication che contiene la classe AzureServiceTokenProvider necessaria per ottenere il token. Essa in base al contesto in cui si trova, cerca di chiamare un endpoint esposto da Visual Studio stesso per il rilascio del token attraverso poi AAD. Il token viene poi messo in cache e restituito per poter essere usato. Laddove abbiamo un SqlConnection, possiamo quindi modificare il codice come segue.
// Ottengo il token var azureServiceTokenProvider = new AzureServiceTokenProvider(); string token = await azureServiceTokenProvider.GetAccessTokenAsync("https://database.windows.net/"); // Creo la connessione var connection = new SqlConnection(connectionString); connection.AccessToken = token;
Come anticipato, la stringa di connessione non deve contenere le credenziali. La chiamata a GetAccessTokenAsync è asincrona, ma in realtà nella maggior parte dei casi si concluderà immediatamente recuperando il token dalla cache, poiché la classe AzureServiceTokenProvider provvede in autonomia al rinnovo dello stesso solo quando necessario.
Questa tecnica è molto comoda e funziona indipendentemente da come l'applicativo sia lanciato o configurato. Inoltre, la stessa classe può essere usata per ottenere token anche per altre tipologie di risorse o quando l'app gira nell'ambito Azure, ma questo sarà oggetto di un prossimo script.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Testare l'invio dei messaggi con Event Hubs Data Explorer
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Filtering sulle colonne in una QuickGrid di Blazor
Ordine e importanza per @layer in CSS
Sostituire la GitHub Action di login su private registry
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Gestire la cancellazione di una richiesta in streaming da Blazor
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Creare gruppi di client per Event Grid MQTT
Eliminare una project wiki di Azure DevOps
Gestione dei nomi con le regole @layer in CSS
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- anche #vs13 update 4 è disponibile in RTM: https://aspit.co/azm
- Indicizzare Cosmos DB con #azure Search https://aspit.co/b4v di @CristianCivera #cosmosdb
- stando a @edbott, la consumer preview di #win8 sarà rilasciata il 29 febbraio! http://aspitalia.com/42