Dela via


Ansluta med hanterad identitet till Azure Database for MySQL

GÄLLER FÖR: Azure Database for MySQL – enskild server

Viktigt!

Azure Database for MySQL – enskild server är på väg att dras tillbaka. Vi rekommenderar starkt att du uppgraderar till en flexibel Azure Database for MySQL-server. Mer information om hur du migrerar till en flexibel Azure Database for MySQL-server finns i Vad händer med Azure Database for MySQL – enskild server?

Den här artikeln visar hur du använder en användartilldelad identitet för en virtuell Azure-dator (VM) för att få åtkomst till en Azure Database for MySQL-server. Hanterade tjänstidentiteter hanteras automatiskt av Azure och gör att du kan autentisera till tjänster som stöder Microsoft Entra-autentisering, utan att behöva infoga autentiseringsuppgifter i koden.

Du lär dig att:

  • Ge den virtuella datorn åtkomst till en Azure Database for MySQL-server
  • Skapa en användare i databasen som representerar den virtuella datorns användartilldelade identitet
  • Hämta en åtkomsttoken med hjälp av den virtuella datoridentiteten och använd den för att fråga en Azure Database for MySQL-server
  • Implementera tokenhämtningen i ett C#-exempelprogram

Viktigt!

Anslutning med hanterad identitet är endast tillgängligt för MySQL 5.7 och senare.

Förutsättningar

Skapa en användartilldelad hanterad identitet för den virtuella datorn

Skapa en identitet i din prenumeration med kommandot az identity create . Du kan använda samma resursgrupp som den virtuella datorn körs i eller en annan.

az identity create --resource-group myResourceGroup --name myManagedIdentity

Om du vill konfigurera identiteten i följande steg använder du kommandot az identity show för att lagra identitetens resurs-ID och klient-ID i variabler.

# Get resource ID of the user-assigned identity

RESOURCE_ID=$(az identity show --resource-group myResourceGroup --name myManagedIdentity --query id --output tsv)

# Get client ID of the user-assigned identity


CLIENT_ID=$(az identity show --resource-group myResourceGroup --name myManagedIdentity --query clientId --output tsv)

Nu kan vi tilldela den användartilldelade identiteten till den virtuella datorn med kommandot az vm identity assign :

az vm identity assign --resource-group myResourceGroup --name myVM --identities $RESOURCE_ID

För att slutföra installationen visar du värdet för klient-ID:t, som du behöver i de närmaste stegen:

echo $CLIENT_ID

Skapa en MySQL-användare för din hanterade identitet

Anslut nu som Microsoft Entra-administratörsanvändare till din MySQL-databas och kör följande SQL-instruktioner:

SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER 'myuser' IDENTIFIED BY 'CLIENT_ID';

Den hanterade identiteten har nu åtkomst när du autentiserar med användarnamnet myuser (ersätt med ett valfritt namn).

Hämta åtkomsttoken från Azure Instance Metadata-tjänsten

Ditt program kan nu hämta en åtkomsttoken från Azure Instance Metadata-tjänsten och använda den för att autentisera med databasen.

Den här tokenhämtningen görs genom att göra en HTTP-begäran till http://169.254.169.254/metadata/identity/oauth2/token och skicka följande parametrar:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (som du hämtade tidigare)

Du får tillbaka ett JSON-resultat som innehåller ett access_token fält – det här långa textvärdet är åtkomsttoken för hanterad identitet som du bör använda som lösenord när du ansluter till databasen.

I testsyfte kan du köra följande kommandon i gränssnittet. Observera att du behöver curl, jqoch mysql klienten installerad.

# Retrieve the access token


ACCESS_TOKEN=$(curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=CLIENT_ID' -H Metadata:true | jq -r .access_token)

# Connect to the database


mysql -h SERVER --user USER@SERVER --enable-cleartext-plugin --password=$accessToken

Nu är du ansluten till den databas som du har konfigurerat tidigare.

Ansluta med hanterad identitet i C#

Det här avsnittet visar hur du hämtar en åtkomsttoken med hjälp av den virtuella datorns användartilldelade hanterade identitet och använder den för att anropa Azure Database for MySQL. Azure Database for MySQL har inbyggt stöd för Microsoft Entra-autentisering, så att det direkt kan acceptera åtkomsttoken som hämtas med hanterade identiteter för Azure-resurser. När du skapar en anslutning till MySQL skickar du åtkomsttoken i lösenordsfältet.

Här är ett .NET-kodexempel på hur du öppnar en anslutning till MySQL med hjälp av en åtkomsttoken. Den här koden måste köras på den virtuella datorn för att få åtkomst till den virtuella datorns användartilldelade hanterade identitetsslutpunkt. .NET Framework 4.6 eller senare eller .NET Core 2.2 eller senare krävs för att använda metoden för åtkomsttoken. Ersätt värdena för HOST, USER, DATABASE och CLIENT_ID.

using System;
using System.Net;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace Driver
{
    class Script
    {
        // Obtain connection string information from the portal
        //
        private static string Host = "HOST";
        private static string User = "USER";
        private static string Database = "DATABASE";
        private static string ClientId = "CLIENT_ID";

        static async Task Main(string[] args)
        {
            //
            // Get an access token for MySQL.
            //
            Console.Out.WriteLine("Getting access token from Azure Instance Metadata service...");

            // Azure AD resource ID for Azure Database for MySQL is https://ossrdbms-aad.database.windows.net/
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=" + ClientId);
            request.Headers["Metadata"] = "true";
            request.Method = "GET";
            string accessToken = null;

            try
            {
                // Call managed identities for Azure resources endpoint.
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Pipe response Stream to a StreamReader and extract access token.
                StreamReader streamResponse = new StreamReader(response.GetResponseStream());
                string stringResponse = streamResponse.ReadToEnd();
                var list = JsonSerializer.Deserialize<Dictionary<string, string>>(stringResponse);
                accessToken = list["access_token"];
            }
            catch (Exception e)
            {
                Console.Out.WriteLine("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                System.Environment.Exit(1);
            }

            //
            // Open a connection to the MySQL server using the access token.
            //
            var builder = new MySqlConnectionStringBuilder
            {
                Server = Host,
                Database = Database,
                UserID = User,
                Password = accessToken,
                SslMode = MySqlSslMode.Required,
            };

            using (var conn = new MySqlConnection(builder.ConnectionString))
            {
                Console.Out.WriteLine("Opening connection using access token...");
                await conn.OpenAsync();

                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "SELECT VERSION()";

                    using (var reader = await command.ExecuteReaderAsync())
                    {
                        while (await reader.ReadAsync())
                        {
                            Console.WriteLine("\nConnected!\n\nMySQL version: {0}", reader.GetString(0));
                        }
                    }
                }
            }
        }
    }
}

När du kör det här kommandot ger det här kommandot utdata så här:

Getting access token from Azure Instance Metadata service...
Opening connection using access token...

Connected!

MySQL version: 5.7.27

Nästa steg