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
- Om du inte känner till funktionen för hanterade identiteter för Azure-resurser kan du läsa igenom den här översikten. Om du inte har ett Azure-konto registrerar du dig för ett kostnadsfritt konto innan du fortsätter.
- För att kunna skapa den nödvändiga resursen och rollhanteringen måste ditt konto ha behörigheten "Ägare" i lämpligt omfång (din prenumeration eller resursgrupp). Om du behöver hjälp med rolltilldelning kan du läsa Tilldela Azure-roller för att hantera åtkomst till dina Azure-prenumerationsresurser.
- Du behöver en virtuell Azure-dator (till exempel att köra Ubuntu Linux) som du vill använda för åtkomst till databasen med hjälp av hanterad identitet
- Du behöver en Azure Database for MySQL-databasserver som har Microsoft Entra-autentisering konfigurerad
- Om du vill följa C#-exemplet slutför du först guiden om hur du ansluter med C#
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
, jq
och 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
- Granska de övergripande begreppen för Microsoft Entra-autentisering med Azure Database for MySQL