Udostępnij za pośrednictwem


Samouczek: tworzenie połączenia bez hasła z usługą bazy danych za pośrednictwem łącznika usługi

Połączenia bez hasła używają tożsamości zarządzanych do uzyskiwania dostępu do usług platformy Azure. Dzięki temu podejściu nie trzeba ręcznie śledzić wpisów tajnych tożsamości zarządzanych i zarządzać nimi. Te zadania są bezpiecznie obsługiwane wewnętrznie przez platformę Azure.

Łącznik usługi umożliwia tożsamości zarządzane w usługach hostingu aplikacji, takich jak Azure Spring Apps, aplikacja systemu Azure Service i Azure Container Apps. Łącznik usługi konfiguruje również usługi bazy danych, takie jak Azure Database for PostgreSQL, Azure Database for MySQL i Azure SQL Database, w celu akceptowania tożsamości zarządzanych.

W tym samouczku użyjesz interfejsu wiersza polecenia platformy Azure, aby wykonać następujące zadania:

  • Sprawdź środowisko początkowe przy użyciu interfejsu wiersza polecenia platformy Azure.
  • Utwórz połączenie bez hasła z łącznikiem usługi.
  • Użyj zmiennych środowiskowych lub konfiguracji wygenerowanych przez łącznik usługi, aby uzyskać dostęp do usługi bazy danych.

Wymagania wstępne

Konfigurowanie środowiska

Klient

Zaloguj się przy użyciu interfejsu wiersza polecenia platformy Azure za pomocą polecenia az login. Jeśli używasz usługi Azure Cloud Shell lub jesteś już zalogowany, potwierdź uwierzytelnione konto przy użyciu polecenia az account show.

Instalowanie rozszerzenia bez hasła łącznika usługi

Zainstaluj najnowsze rozszerzenie bez hasła łącznika usługi dla interfejsu wiersza polecenia platformy Azure:

az extension add --name serviceconnector-passwordless --upgrade

Uwaga

Sprawdź rozszerzenie "serviceconnector-passwordless" w wersji "2.0.2" lub nowszej, uruchamiając polecenie az version. Aby uaktualnić wersję rozszerzenia, może być konieczne uaktualnienie interfejsu wiersza polecenia platformy Azure.

Tworzenie połączenia bez hasła

Następnie użyjemy usługi aplikacja systemu Azure Jako przykładu do utworzenia połączenia przy użyciu tożsamości zarządzanej.

Jeśli używasz:

Uwaga

Jeśli używasz witryny Azure Portal, przejdź do bloku Łącznik usługi aplikacja systemu Azure Service, Azure Spring Apps lub Azure Container Apps, a następnie wybierz pozycję Utwórz, aby utworzyć połączenie. Witryna Azure Portal automatycznie utworzy polecenie i wyzwoli wykonanie polecenia w usłudze Cloud Shell.

Następujące polecenie interfejsu wiersza polecenia platformy Azure używa parametru --client-type , może to być java, dotnet, python itp. Uruchom polecenie az webapp connection create postgres-flexible -h , aby uzyskać obsługiwane typy klientów, a następnie wybierz ten, który jest zgodny z aplikacją.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type $CLIENT_TYPE

Usługa Azure Database for MySQL — serwer elastyczny wymaga przypisanej przez użytkownika tożsamości zarządzanej w celu włączenia uwierzytelniania firmy Microsoft. Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania entra firmy Microsoft dla usługi Azure Database for MySQL — serwer elastyczny. Aby utworzyć tożsamość zarządzaną przypisaną przez użytkownika, możesz użyć następującego polecenia:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Ważne

Po utworzeniu tożsamości zarządzanej przypisanej przez użytkownika poproś administratora globalnego lub administratora ról uprzywilejowanych o przyznanie następujących uprawnień dla tej tożsamości:

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

Aby uzyskać więcej informacji, zobacz sekcję Uprawnienia uwierzytelniania usługi Active Directory.

Następnie połącz aplikację z bazą danych MySQL przy użyciu przypisanej przez system tożsamości zarządzanej przy użyciu łącznika usługi.

Następujące polecenie interfejsu wiersza polecenia platformy Azure używa parametru --client-type . Uruchom polecenie , az webapp connection create mysql-flexible -h aby uzyskać obsługiwane typy klientów, a następnie wybierz ten, który jest zgodny z twoją aplikacją.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

Następujące polecenie interfejsu wiersza polecenia platformy Azure używa parametru --client-type . Uruchom polecenie , az webapp connection create sql -h aby uzyskać obsługiwane typy klientów, a następnie wybierz ten, który jest zgodny z twoją aplikacją.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

To polecenie łącznika usługi wykonuje następujące zadania w tle:

  • Włącz tożsamość zarządzaną przypisaną przez system lub przypisz tożsamość użytkownika dla aplikacji $APPSERVICE_NAME hostowanej przez usługę aplikacja systemu Azure Service/Azure Spring Apps/Azure Container Apps.
  • Włącz uwierzytelnianie Entra firmy Microsoft dla serwera bazy danych, jeśli nie jest włączone wcześniej.
  • Ustaw administratora firmy Microsoft Entra na bieżącego zalogowanego użytkownika.
  • Dodaj użytkownika bazy danych dla przypisanej przez system tożsamości zarządzanej, tożsamości zarządzanej przypisanej przez użytkownika lub jednostki usługi. Przyznaj temu użytkownikowi wszystkie uprawnienia bazy danych $DATABASE_NAME . Nazwę użytkownika można znaleźć w parametry połączenia w poprzednich danych wyjściowych polecenia.
  • Ustaw konfiguracje o nazwie AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRINGlub AZURE_SQL_CONNECTIONSTRING na zasób platformy Azure na podstawie typu bazy danych.
    • W przypadku usługi App Service konfiguracje są ustawiane w bloku Ustawienia aplikacji.
    • W przypadku aplikacji Spring Apps konfiguracje są ustawiane podczas uruchamiania aplikacji.
    • W przypadku usługi Container Apps konfiguracje są ustawiane na zmienne środowiskowe. Wszystkie konfiguracje i ich wartości można pobrać w bloku Łącznik usługi w witrynie Azure Portal.

Łącznik usługi przypisze użytkownikowi następujące uprawnienia. Można je odwołać i dostosować uprawnienia zgodnie z wymaganiami.

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";

Nawiązywanie połączenia z bazą danych przy użyciu uwierzytelniania firmy Microsoft Entra

Po utworzeniu połączenia możesz użyć parametry połączenia w aplikacji, aby nawiązać połączenie z bazą danych przy użyciu uwierzytelniania firmy Microsoft Entra. Na przykład możesz użyć następujących rozwiązań, aby nawiązać połączenie z bazą danych za pomocą uwierzytelniania firmy Microsoft Entra.

W przypadku platformy .NET nie ma wtyczki ani biblioteki do obsługi połączeń bez hasła. Token dostępu dla tożsamości zarządzanej lub jednostki usługi można uzyskać przy użyciu biblioteki klienta, takiej jak Azure.Identity. Następnie możesz użyć tokenu dostępu jako hasła, aby nawiązać połączenie z bazą danych. Korzystając z poniższego kodu, usuń komentarz z części fragmentu kodu dla typu uwierzytelniania, którego chcesz użyć.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// 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();
}

Następnie, jeśli utworzono tabele i sekwencje na serwerze elastycznym PostgreSQL przed użyciem łącznika usługi, musisz nawiązać połączenie jako właściciel i udzielić uprawnień do <aad-username> utworzenia przez łącznik usługi. Nazwa użytkownika z parametry połączenia lub konfiguracji ustawionej przez łącznik usługi powinna wyglądać następująco: aad_<connection name>. Jeśli używasz witryny Azure Portal, wybierz przycisk rozwijania obok Service Type kolumny i pobierz wartość. Jeśli używasz interfejsu wiersza polecenia platformy Azure, sprawdź configurations dane wyjściowe polecenia interfejsu wiersza polecenia.

Następnie wykonaj zapytanie, aby udzielić uprawnienia

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>\";"

Element <owner-username> i <owner-password> jest właścicielem istniejącej tabeli, która może udzielić uprawnień innym osobom. <aad-username> to użytkownik utworzony przez łącznik usługi. Zastąp je rzeczywistą wartością.

Zweryfikuj wynik za pomocą polecenia :

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

W przypadku platformy .NET nie ma wtyczki ani biblioteki do obsługi połączeń bez hasła. Token dostępu dla tożsamości zarządzanej lub jednostki usługi można uzyskać przy użyciu biblioteki klienta, takiej jak Azure.Identity. Następnie możesz użyć tokenu dostępu jako hasła, aby nawiązać połączenie z bazą danych. Korzystając z poniższego kodu, usuń komentarz z części fragmentu kodu dla typu uwierzytelniania, którego chcesz użyć.

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines corresponding to the authentication type you want to use.
// 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");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

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

Aby uzyskać więcej przykładów kodu, zobacz Nawiązywanie połączenia z bazami danych platformy Azure z usługi App Service bez wpisów tajnych przy użyciu tożsamości zarządzanej.

  1. Instalowanie zależności.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Pobierz parametry połączenia usługi Azure SQL Database ze zmiennej środowiskowej dodanej przez łącznik usługi.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Aby uzyskać więcej informacji, zobacz Używanie uwierzytelniania tożsamości zarządzanej usługi Active Directory.

Aby uzyskać więcej informacji, zobacz Strona główna programowania klientów w programie Microsoft SQL Server.

Wdrażanie aplikacji w usłudze hostingu platformy Azure

Na koniec wdróż aplikację w usłudze hostingu platformy Azure. Ta usługa źródłowa może używać tożsamości zarządzanej do nawiązywania połączenia z docelową bazą danych na platformie Azure.

Aby uzyskać aplikacja systemu Azure Service, możesz sprawdzić dokument, aby wybrać sposób wdrażania, zobacz Szybki start: wdrażanie aplikacji internetowej ASP.NET.

Następnie możesz sprawdzić dziennik lub wywołać aplikację, aby sprawdzić, czy może pomyślnie nawiązać połączenie z bazą danych platformy Azure.

Rozwiązywanie problemów

Uprawnienie

Jeśli wystąpią jakiekolwiek błędy związane z uprawnieniami, potwierdź zalogowanego użytkownika interfejsu wiersza polecenia platformy Azure za pomocą polecenia az account show. Upewnij się, że logujesz się przy użyciu poprawnego konta. Następnie upewnij się, że masz następujące uprawnienia, które mogą być wymagane do utworzenia połączenia bez hasła z łącznikiem usługi.

Uprawnienie Operacja
Microsoft.DBforPostgreSQL/flexibleServers/read Wymagane do uzyskania informacji o serwerze bazy danych
Microsoft.DBforPostgreSQL/flexibleServers/write Wymagane do włączenia uwierzytelniania entra firmy Microsoft dla serwera bazy danych
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Wymagane do utworzenia reguły zapory w przypadku zablokowania lokalnego adresu IP
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Wymagane do odwrócenia reguły zapory utworzonej przez łącznik usługi w celu uniknięcia problemu z zabezpieczeniami
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Wymagane do sprawdzenia, czy użytkownik logowania interfejsu wiersza polecenia platformy Azure jest serwerem bazy danych Microsoft Entra administrator
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Wymagane do dodania użytkownika logowania interfejsu wiersza polecenia platformy Azure jako serwera bazy danych Microsoft Entra administrator
Uprawnienie Operacja
Microsoft.DBforMySQL/flexibleServers/read Wymagane do uzyskania informacji o serwerze bazy danych
Microsoft.DBforMySQL/flexibleServers/write Wymagane do dodania podanej tożsamości zarządzanej przypisanej przez użytkownika do serwera bazy danych
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Wymagane do utworzenia reguły zapory w przypadku zablokowania lokalnego adresu IP
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Wymagane do odwrócenia reguły zapory utworzonej przez łącznik usługi w celu uniknięcia problemu z zabezpieczeniami
Microsoft.DBforMySQL/flexibleServers/administrators/read Wymagane do sprawdzenia, czy użytkownik logowania interfejsu wiersza polecenia platformy Azure jest serwerem bazy danych Microsoft Entra administrator
Microsoft.DBforMySQL/flexibleServers/administrators/write Wymagane do dodania użytkownika logowania interfejsu wiersza polecenia platformy Azure jako serwera bazy danych Microsoft Entra administrator
Uprawnienie Operacja
Microsoft.Sql/servers/read Wymagane do uzyskania informacji o serwerze bazy danych
Microsoft.Sql/servers/firewallRules/write Wymagane do utworzenia reguły zapory w przypadku zablokowania lokalnego adresu IP
Microsoft.Sql/servers/firewallRules/delete Wymagane do odwrócenia reguły zapory utworzonej przez łącznik usługi w celu uniknięcia problemu z zabezpieczeniami
Microsoft.Sql/servers/administrators/read Wymagane do sprawdzenia, czy użytkownik logowania interfejsu wiersza polecenia platformy Azure jest serwerem bazy danych Microsoft Entra administrator
Microsoft.Sql/servers/administrators/write Wymagane do dodania użytkownika logowania interfejsu wiersza polecenia platformy Azure jako serwera bazy danych Microsoft Entra administrator

W niektórych przypadkach uprawnienia nie są wymagane. Jeśli na przykład użytkownik uwierzytelniony za pomocą interfejsu wiersza polecenia platformy Azure jest już administratorem usługi Active Directory na serwerze SQL, nie musisz mieć Microsoft.Sql/servers/administrators/write uprawnień.

Microsoft Entra ID

Jeśli wystąpi błąd ERROR: AADSTS530003: Your device is required to be managed to access this resource., poproś dział IT o pomoc przy dołączeniu tego urządzenia do identyfikatora Entra firmy Microsoft. Aby uzyskać więcej informacji, zobacz Urządzenia dołączone do firmy Microsoft.

Łącznik usługi musi uzyskać dostęp do identyfikatora entra firmy Microsoft, aby uzyskać informacje o twoim koncie i tożsamości zarządzanej usługi hostingu. Możesz użyć następującego polecenia, aby sprawdzić, czy urządzenie może uzyskać dostęp do identyfikatora Firmy Microsoft Entra:

az ad signed-in-user show

Jeśli nie logujesz się interaktywnie, może zostać wyświetlony błąd i Interactive authentication is needed. Aby rozwiązać ten problem, zaloguj się za az login pomocą polecenia .

Łączność sieciowa

Jeśli serwer bazy danych znajduje się w sieci wirtualnej, upewnij się, że środowisko uruchamiające polecenie interfejsu wiersza polecenia platformy Azure może uzyskać dostęp do serwera w sieci wirtualnej.

Jeśli serwer bazy danych znajduje się w sieci wirtualnej, upewnij się, że środowisko uruchamiające polecenie interfejsu wiersza polecenia platformy Azure może uzyskać dostęp do serwera w sieci wirtualnej.

Jeśli serwer bazy danych nie zezwala na dostęp publiczny, upewnij się, że środowisko uruchamiające polecenie interfejsu wiersza polecenia platformy Azure może uzyskać dostęp do serwera za pośrednictwem prywatnego punktu końcowego.

Następne kroki

Aby uzyskać więcej informacji na temat łącznika usługi i połączeń bez hasła, zobacz następujące zasoby: