App Service offre un servizio di hosting Web altamente scalabile e auto-patch in Azure. Fornisce anche un'identità gestita per la tua applicazione, che è una soluzione pronta all'uso per proteggere l'accesso ai database Azure, tra cui:
Le identità gestite nel servizio app rendono l'app più sicura eliminando i segreti dall'app, ad esempio le credenziali nelle stringhe di connessione. Questa esercitazione illustra come connettersi ai database indicati in precedenza dal Servizio app usando identità gestite.
Cosa imparerai:
- Configurare un utente Microsoft Entra come amministratore per il database Azure.
- Connettersi al database come utente Microsoft Entra.
- Configurare un'identità gestita assegnata dal sistema o dall'utente per un'app di App Service.
- Concedere all'identità gestita l'accesso al database.
- Connetti il database Azure dal tuo codice (.NET Framework 4.8, .NET 6, Node.js, Python, Java) utilizzando un'identità gestita.
- Connettersi al database Azure dall'ambiente di sviluppo usando l'utente Microsoft Entra.
Se non si ha un account Azure, creare un account free prima di iniziare.
Prerequisiti
- Creare un'app nel servizio app in base a .NET, Node.js, Python o Java.
- Creare un server di database con Azure SQL Database, Azure Database for MySQL o Azure Database for PostgreSQL.
- È necessario avere familiarità con il modello di connettività standard (con nome utente e password) e potersi connettere correttamente dall'app del Servizio app al database preferito.
Preparare l'ambiente per il Azure CLI.
1. Installare l'estensione senza password del Connettore di servizi
Installare l'estensione senza password di Service Connector più recente per il Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Nota
Verificare che la versione dell'estensione "serviceconnector-passwordless" sia "2.0.2" o successiva eseguendo az version. Potrebbe essere necessario aggiornare Azure CLI prima di aggiornare la versione dell'estensione.
2. Creare una connessione senza password
Creare quindi una connessione senza password con Connettore di servizi.
Suggerimento
Il portale di Azure consente di comporre i comandi seguenti. Nel portale di Azure passare alla risorsa Azure App Service, selezionare Service Connector dal menu a sinistra e selezionare Crea. Compilare il modulo con tutti i parametri obbligatori. Azure genera automaticamente il comando di creazione della connessione, che è possibile copiare per usarlo nell'interfaccia della riga di comando o eseguirlo in Azure Cloud Shell.
Il comando Azure CLI seguente usa un parametro --client-type.
Facoltativamente, eseguire az webapp connection create sql -h per ottenere i tipi di client supportati.
Scegliere un tipo di client ed eseguire il comando corrispondente. Sostituire i segnaposto seguenti con le proprie informazioni.
az webapp connection create sql \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <sql-group-name> \
--server <sql-name> \
--database <database-name> \
--user-identity client-id=<client-id> subs-id=<subscription-id> \
--client-type <client-type>
az webapp connection create sql \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <sql-name> \
--database <database-name> \
--system-identity \
--client-type <client-type>
Nota
Per Azure Database for MySQL - Server flessibile, è necessario innanzitutto configurare manualmente l'autenticazione Microsoft Entra, che richiede un'identità gestita separata assegnata dall'utente e autorizzazioni specifiche per Microsoft Graph. Questo passaggio non può essere automatizzato.
impostare manualmente l'autenticazione Microsoft Entra per Azure Database for MySQL - Server flessibile.
Facoltativamente, eseguire il comando az webapp connection create mysql-flexible -h per ottenere i tipi di client supportati.
Scegliere un tipo di client ed eseguire il comando corrispondente. Il comando Azure CLI seguente usa un parametro --client-type.
az webapp connection create mysql-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <mysql-name> \
--database <database-name> \
--user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
--client-type <client-type>
az webapp connection create mysql-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <mysql-name> \
--database <database-name> \
--system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \
--client-type <client-type>
Il comando Azure CLI seguente usa un parametro --client-type.
Facoltativamente, eseguire il comando az webapp connection create postgres-flexible -h per ottenere un elenco di tutti i tipi di client supportati.
Scegliere un tipo di client ed eseguire il comando corrispondente.
az webapp connection create postgres-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <postgresql-name> \
--database <database-name> \
--user-identity client-id=XX subs-id=XX \
--client-type java
az webapp connection create postgres-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <postgresql-name> \
--database <database-name> \
--system-identity \
--client-type <client-type>
Concedere l'autorizzazione alle tabelle create in modo preliminare
Successivamente, se si sono create tabelle e sequenze nel server flessibile PostgreSQL prima di usare Connettore di servizi, è necessario connettersi come proprietario e concedere l'autorizzazione alle <aad-username> create da Connettore di servizi. Il nome utente del connection string o della configurazione impostato da Service Connector dovrebbe essere simile a aad_<connection name>. Se si usa il portale di Azure, selezionare il pulsante espandi accanto alla colonna Service Type e ottenere il valore. Se si usa Azure CLI, controllare configurations nell'output del comando CLI.
Eseguire quindi la query per concedere l'autorizzazione
az extension add --name rdbms-connect
az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"
<owner-username> e <owner-password> sono i proprietari della tabella esistente che può concedere autorizzazioni ad altri utenti.
<aad-username> è l'utente creato da Connettore di servizi. Sostituirli con i valori effettivi.
Convalidare il risultato tramite il comando:
az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table
Questo comando di Connettore servizio completa le attività seguenti in background:
- Abilitare l'identità gestita assegnata dal sistema o assegnare un'identità utente per l'app
<server-name> ospitata da Azure App Service.
- Impostare l'amministratore Microsoft Entra sull'utente connesso corrente.
- Aggiungere un utente del database per l'identità gestita assegnata al sistema o assegnata dall'utente. Concedere a questo utente tutti i privilegi del database
<database-name>. Il nome utente è disponibile nella connection string nell'output del comando precedente.
- Impostare le configurazioni denominate
AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING o AZURE_SQL_CONNECTIONSTRING alla risorsa Azure in base al tipo di database.
- Per il servizio app, le configurazioni vengono impostate nel pannello Impostazioni app .
Se si verificano problemi durante la creazione di una connessione, vedere Risoluzione dei problemi per assistenza.
3. Modificare il codice
Installare le dipendenze.
dotnet add package Microsoft.Data.SqlClient
Ottieni la stringa di connessione di Azure SQL Database dalla variabile di ambiente aggiunta da Service Connector.
using Microsoft.Data.SqlClient;
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
// For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
Per altre informazioni, vedere Using Active Directory Managed Identity Authentication.
Aggiungere le dipendenze seguenti nel file pom.xml:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.4.6</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>10.2.0.jre11</version>
</dependency>
Ottenere la stringa di connessione del database SQL di Azure dalla variabile di ambiente aggiunta da Service Connector.
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class Main {
public static void main(String[] args) {
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};authentication=ActiveDirectoryMSI;"
// For user-assigned managed identity: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};msiClientId={UserAssignedMiClientId};authentication=ActiveDirectoryMSI;"
String connectionString = System.getenv("AZURE_SQL_CONNECTIONSTRING");
SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL(connectionString);
try (Connection connection = ds.getConnection()) {
System.out.println("Connected successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Per ulteriori informazioni, vedere Connettersi utilizzando l'autenticazione di Microsoft Entra.
Installare le dipendenze.
python -m pip install mssql-python python-dotenv
Ottenere le configurazioni di connessione Azure SQL Database dalla variabile di ambiente aggiunta da Service Connector. Decommentare la parte del codice per il tipo di autenticazione che si vuole usare.
import os
from mssql_python import connect
server = os.getenv('AZURE_SQL_SERVER')
port = os.getenv('AZURE_SQL_PORT')
database = os.getenv('AZURE_SQL_DATABASE')
# Uncomment the following lines according to the authentication type.
# For system-assigned managed identity.
# connection_string = f'Server={server},{port};Database={database};Authentication=ActiveDirectoryMSI;Encrypt=yes;'
# For user-assigned managed identity.
# client_id = os.getenv('AZURE_SQL_USER')
# connection_string = f'Server={server},{port};Database={database};UID={client_id};Authentication=ActiveDirectoryMSI;Encrypt=yes;'
conn = connect(connection_string)
Per un metodo alternativo, è anche possibile connettersi a Azure SQL Database usando un token di accesso, vedere Migrate un'applicazione Python per usare connessioni senza password con Azure SQL Database.
- Installare le dipendenze.
npm install mssql
- Ottenere le configurazioni di connessione Azure SQL Database dalle variabili di ambiente aggiunte da Service Connector. Decommentare la parte del codice per il tipo di autenticazione che si vuole usare.
import sql from 'mssql';
const server = process.env.AZURE_SQL_SERVER;
const database = process.env.AZURE_SQL_DATABASE;
const port = parseInt(process.env.AZURE_SQL_PORT);
const authenticationType = process.env.AZURE_SQL_AUTHENTICATIONTYPE;
// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// const config = {
// server,
// port,
// database,
// authentication: {
// authenticationType
// },
// options: {
// encrypt: true
// }
// };
// For user-assigned managed identity.
// const clientId = process.env.AZURE_SQL_CLIENTID;
// const config = {
// server,
// port,
// database,
// authentication: {
// type: authenticationType
// },
// options: {
// encrypt: true,
// clientId: clientId
// }
// };
this.poolconnection = await sql.connect(config);
Per ulteriori informazioni, vedere pagina iniziale per la programmazione del client su Microsoft SQL Server.
Per altri esempi di codice, vedere Creare una connessione senza password a un servizio di database tramite Connettore di servizi.
La connettività al Azure Database for MySQL nel codice segue il modello DefaultAzureCredential per tutti gli stack di linguaggi.
DefaultAzureCredential è sufficientemente flessibile da adattarsi sia all'ambiente di sviluppo che all'ambiente di Azure. Durante l'esecuzione in locale, può recuperare l'utente Azure connesso dall'ambiente preferito (Visual Studio, Visual Studio Code, Azure CLI o Azure PowerShell). Durante l'esecuzione in Azure, recupera l'identità gestita. È quindi possibile avere connettività al database sia in fase di sviluppo che di produzione. Il modello è il seguente:
- Creare un'istanza di
DefaultAzureCredential utilizzando la libreria client di Azure Identity. Se si usa un'identità assegnata dall'utente, specificare l'ID client dell'identità.
- Ottenere un token di accesso per Azure Database for MySQL:
https://ossrdbms-aad.database.windows.net/.default.
- Aggiungere il token al connection string.
- Aprire la connessione.
Per .NET, ottenere un token di accesso per l'identità gestita usando una libreria client, ad esempio Azure. Identità. Usare quindi il token di accesso come password per connettersi al database. Quando si usa il codice seguente, assicurarsi di rimuovere il commento dalla parte del frammento del codice corrispondente al tipo di autenticazione da usare.
using Azure.Core;
using Azure.Identity;
using MySqlConnector;
// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();
// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// });
var tokenRequestContext = new TokenRequestContext(
new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
$"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";
using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();
// do something
Aggiungere le dipendenze seguenti nel file pom.xml:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity-extensions</artifactId>
<version>1.2.0</version>
</dependency>
Ottenere il connection string dalla variabile di ambiente e aggiungere il nome del plug-in per connettersi al database:
String url = System.getenv("AZURE_MYSQL_CONNECTIONSTRING");
String pluginName = "com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin";
Connection connection = DriverManager.getConnection(url + "&defaultAuthenticationPlugin=" +
pluginName + "&authenticationPlugins=" + pluginName);
Per altre informazioni, vedere Usare Java e JDBC con Azure Database for MySQL - Server flessibile.
Installare le dipendenze.
pip install azure-identity
# install Connector/Python https://dev.mysql.com/doc/connector-python/en/connector-python-installation.html
pip install mysql-connector-python
Eseguire l'autenticazione con un token di accesso dalla libreria azure-identity. Ottenere le informazioni di connessione dalla variabile di ambiente aggiunta da Connettore di servizi. Quando si usa il codice seguente, assicurarsi di rimuovere il commento dalla parte del frammento del codice corrispondente al tipo di autenticazione da usare.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import mysql.connector
import os
# Uncomment the following lines according to the authentication type.
# For system-assigned managed identity.
# cred = ManagedIdentityCredential()
# For user-assigned managed identity.
# managed_identity_client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# acquire token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# open connect to Azure MySQL with the access token.
host = os.getenv('AZURE_MYSQL_HOST')
database = os.getenv('AZURE_MYSQL_NAME')
user = os.getenv('AZURE_MYSQL_USER')
password = accessToken.token
cnx = mysql.connector.connect(user=user,
password=password,
host=host,
database=database)
cnx.close()
Installare le dipendenze.
npm install --save @azure/identity
npm install --save mysql2
Ottenere un token di accesso usando @azure/identity e le informazioni del database MySQL Azure dalle variabili di ambiente aggiunte da Service Connector. Quando si usa il codice seguente, assicurarsi di rimuovere il commento dalla parte del frammento del codice corrispondente al tipo di autenticazione da usare.
import { DefaultAzureCredential,ClientSecretCredential } from "@azure/identity";
const mysql = require('mysql2');
// Uncomment the following lines according to the authentication type.
// for system-assigned managed identity
// const credential = new DefaultAzureCredential();
// for user-assigned managed identity
// const clientId = process.env.AZURE_MYSQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// acquire token
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
const connection = mysql.createConnection({
host: process.env.AZURE_MYSQL_HOST,
user: process.env.AZURE_MYSQL_USER,
password: accessToken.token,
database: process.env.AZURE_MYSQL_DATABASE,
port: process.env.AZURE_MYSQL_PORT,
ssl: process.env.AZURE_MYSQL_SSL
});
connection.connect((err) => {
if (err) {
console.error('Error connecting to MySQL database: ' + err.stack);
return;
}
console.log('Connected to MySQL database');
});
Per altri esempi di codice, vedere Creare una connessione senza password a un servizio di database tramite Connettore di servizi.
La connettività al Azure Database for PostgreSQL nel codice segue il modello DefaultAzureCredential per tutti gli stack di linguaggi.
DefaultAzureCredential è sufficientemente flessibile da adattarsi sia all'ambiente di sviluppo che all'ambiente di Azure. Durante l'esecuzione in locale, può recuperare l'utente Azure connesso dall'ambiente preferito (Visual Studio, Visual Studio Code, Azure CLI o Azure PowerShell). Durante l'esecuzione in Azure, recupera l'identità gestita. È quindi possibile avere connettività al database sia in fase di sviluppo che di produzione. Il modello è il seguente:
- Istanzia un
DefaultAzureCredential tramite la libreria client di Azure Identity. Se si usa un'identità assegnata dall'utente, specificare l'ID client dell'identità.
- Ottenere un token di accesso per Azure Database for PostgreSQL:
https://ossrdbms-aad.database.windows.net/.default.
- Aggiungere il token al connection string.
- Aprire la connessione.
Per .NET, ottenere un token di accesso per l'identità gestita usando una libreria client, ad esempio Azure. Identità. Usare quindi il token di accesso come password per connettersi al database. Quando si usa il codice seguente, assicurarsi di rimuovere il commento dalla parte del frammento del codice corrispondente al tipo di autenticazione da usare.
using Azure.Identity;
using Azure.Core;
using Npgsql;
// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// }
// );
// Acquire the access token.
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
new TokenRequestContext(scopes: new string[]
{
"https://ossrdbms-aad.database.windows.net/.default"
}));
// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
$"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";
// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
Console.WriteLine("Opening connection using access token...");
connection.Open();
}
Aggiungere le dipendenze seguenti nel file pom.xml:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.5</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity-extensions</artifactId>
<version>1.2.0</version>
</dependency>
Ottenere il connection string dalle variabili di ambiente e aggiungere il nome del plug-in per connettersi al database:
import java.sql.*;
String url = System.getenv("AZURE_POSTGRESQL_CONNECTIONSTRING");
String pluginName = "com.Azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin";
Connection connection = DriverManager.getConnection(url + "&authenticationPluginClassName=" + pluginName);
Per ulteriori informazioni, vedi le seguenti risorse:
Installare le dipendenze.
pip install azure-identity
pip install psycopg2-binary
Eseguire l'autenticazione con un token di accesso dalla libreria azure-identity e usare il token come password. Ottenere le informazioni di connessione dalle variabili di ambiente aggiunte da Connettore di servizi. Quando si usa il codice seguente, assicurarsi di rimuovere il commento dalla parte del frammento del codice corrispondente al tipo di autenticazione da usare.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines according to the authentication type.
# For system-assigned identity.
# cred = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# Acquire the access token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# Combine the token with the connection string from the environment variables added by Service Connector to establish the connection.
conn_string = os.getenv('AZURE_POSTGRESQL_CONNECTIONSTRING')
conn = psycopg2.connect(conn_string + ' password=' + accessToken.token)
Per ulteriori informazioni, vedi le seguenti risorse:
Installare le dipendenze.
npm install --save @azure/identity
npm install --save pg
Nel codice, ottenere il token di accesso tramite @azure/identity e le informazioni sulla connessione PostgreSQL dalle variabili di ambiente aggiunte dal servizio Connettore di servizi. Combinarli per stabilire la connessione. Quando si usa il codice seguente, assicurarsi di rimuovere il commento dalla parte del frammento del codice corrispondente al tipo di autenticazione da usare.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// const credential = new DefaultAzureCredential();
// For user-assigned identity.
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// Acquire the access token.
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
// Use the token and the connection information from the environment variables added by Service Connector to establish the connection.
(async () => {
const client = new Client({
host: process.env.AZURE_POSTGRESQL_HOST,
user: process.env.AZURE_POSTGRESQL_USER,
password: accesstoken.token,
database: process.env.AZURE_POSTGRESQL_DATABASE,
port: Number(process.env.AZURE_POSTGRESQL_PORT) ,
ssl: process.env.AZURE_POSTGRESQL_SSL
});
await client.connect();
await client.end();
})();
Per altri esempi di codice, vedere Creare una connessione senza password a un servizio di database tramite Connettore di servizi.
4. Configurare l'ambiente di sviluppo
Questo codice di esempio usa DefaultAzureCredential per ottenere un token utilizzabile per il database Azure da Microsoft Entra ID e quindi lo aggiunge alla connessione al database. Anche se è possibile personalizzare DefaultAzureCredential, è già versatile di default. Ottiene un token dall'utente Microsoft Entra connesso o da un'identità gestita, a seconda che venga eseguito in locale nell'ambiente di sviluppo o nel servizio app.
Senza ulteriori modifiche, il codice è pronto per l'esecuzione in Azure. Per eseguire il debug del codice in locale, tuttavia, l'ambiente di sviluppo necessita di un utente connesso Microsoft Entra. In questo passaggio si configura l'ambiente preferito accedendo con l'utente Microsoft Entra.
Visual Studio per Windows è integrato con l'autenticazione di Microsoft Entra. Per abilitare lo sviluppo e il debug in Visual Studio, aggiungere l'utente Microsoft Entra in Visual Studio selezionando File>Impostazioni account dal menu e selezionare Sign in or Add.
Per impostare l'utente Microsoft Entra per l'autenticazione del servizio Azure, selezionare Tools>Options dal menu, quindi selezionare Azure Service Authentication>Account Selection. Selezionare l'utente Microsoft Entra aggiunto e selezionare OK.
Visual Studio per Mac non è integrato con l'autenticazione Microsoft Entra. Tuttavia, la libreria client di Azure Identity che verrà usata in un secondo momento può anche recuperare i token da Azure CLI. Per abilitare lo sviluppo e il debug in Visual Studio, installare Azure CLI nel computer locale.
Accedere a Azure CLI con il comando seguente usando l'utente Microsoft Entra:
az login --allow-no-subscriptions
Visual Studio Code è integrato con l'autenticazione Microsoft Entra tramite l'estensione Azure. Installare l'estensione Azure Tools in Visual Studio Code.
In Visual Studio Code, nella barra Activity Bar selezionare il logo Azure.
Nello strumento di esplorazione Servizio app selezionare Accedere a Azure... e seguire le istruzioni.
La libreria client Azure Identity che verrà usata in un secondo momento può usare i token di Azure CLI. Per abilitare lo sviluppo basato sulla riga di comando, installare Azure CLI nel computer locale.
Accedere a Azure con il comando seguente usando l'utente Microsoft Entra:
az login --allow-no-subscriptions
La libreria client Azure Identity che verrà usata in un secondo momento può usare i token di Azure PowerShell. Per abilitare lo sviluppo basato sulla riga di comando, installare Azure PowerShell nel computer locale.
Accedere a Azure CLI con il cmdlet seguente usando l'utente Microsoft Entra:
Connect-AzAccount
Per ulteriori informazioni sulla configurazione dell'ambiente di sviluppo per l'autenticazione di Microsoft Entra, vedere Libreria client di identità di Azure per .NET.
A questo punto è possibile sviluppare ed eseguire il debug dell'app con il database SQL come back-end usando Microsoft Entra l'autenticazione.
5. Testare e pubblicare
Eseguire il codice nell'ambiente di sviluppo. Il codice usa l'utente Microsoft Entra connesso nell'ambiente per connettersi al database back-end. L'utente può accedere al database perché è configurato come amministratore di Microsoft Entra per il database.
Pubblicare il codice in Azure usando il metodo di pubblicazione preferito. In App Service, il tuo codice utilizza l'identità gestita dell'app per connettersi al database di back-end.
Domande frequenti
L'identità gestita supporta SQL Server?
Sì. Per altre informazioni, vedi:
Viene visualizzato l'errore Login failed for user '<token-identified principal>'.
L'identità gestita per cui si sta tentando di richiedere un token non è autorizzata ad accedere al database Azure.
Sono state apportate modifiche all'autenticazione del Servizio app o alla registrazione dell'app associata. Perché si ottiene ancora il vecchio token?
Anche i servizi back-end delle identità gestite gestiscono una cache di token che aggiorna il token per una risorsa di destinazione solo quando scade. Se si tenta di modificare la configurazione dopo aver provato a ottenere un token con l'applicazione, non si otterrà un nuovo token con le autorizzazioni aggiornate fino alla scadenza del token memorizzato nella cache. Il modo migliore per risolvere questo problema consiste nel testare le modifiche con una nuova finestra InPrivate (Edge)/privata (Safari)/Incognito (Chrome). In questo modo, si è sicuri di iniziare da una nuova sessione autenticata.
Come si aggiunge l'identità gestita a un gruppo di Microsoft Entra?
Se si vuole, è possibile aggiungere l'identità a un gruppo Microsoft Entra, quindi concedere l'accesso al gruppo di Microsoft Entra anziché all'identità. Ad esempio, i comandi seguenti aggiungono l'identità gestita del passaggio precedente a un nuovo gruppo denominato myAzureSQLDBAccessGroup:
groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
Per concedere le autorizzazioni di database per un gruppo di Microsoft Entra, vedere la documentazione relativa al tipo di database corrispondente.
Viene visualizzato l'errore SSL connection is required. Please specify SSL options and retry.
La connessione al database Azure richiede impostazioni aggiuntive e non rientra nell'ambito di questa esercitazione. Per ulteriori informazioni, vedere uno degli link seguenti:
Configurare la connettività TLS in Azure Database for PostgreSQL - Server singoloConfigurare la connettività SSL nell'applicazione per connettersi in modo sicuro a Azure Database for MySQL
Service Connector richiede l'accesso alla rete al database per concedere l'accesso all'identità dell'app. Quando si crea un'architettura di database e app sicura per impostazione predefinita nel portale di Azure con il modello App Web e database, l'architettura blocca l'accesso alla rete al database e consente solo le connessioni dall'interno della rete virtuale. È anche vero per Azure Cloud Shell. Tuttavia, è possibile deploy Cloud Shell nella rete virtuale, quindi eseguire il comando Service Connector in tale Cloud Shell.
Passaggi successivi
Cosa hai appreso:
- Configurare un utente Microsoft Entra come amministratore per il database Azure.
- Connettersi al database come utente Microsoft Entra.
- Configurare un'identità gestita assegnata dal sistema o dall'utente per un'app di App Service.
- Concedere all'identità gestita l'accesso al database.
- Connetti il database Azure dal tuo codice (.NET Framework 4.8, .NET 6, Node.js, Python, Java) utilizzando un'identità gestita.
- Connettersi al database Azure dall'ambiente di sviluppo usando l'utente Microsoft Entra.