Herstellen einer Verbindung mithilfe der Microsoft Entra-Authentifizierung

PHP-Treiber herunterladen

Microsoft Entra ID ist eine zentrale Technologie zur Verwaltung von Benutzer-IDs, die als Alternative zur SQL Server-Authentifizierung fungiert. Microsoft Entra ID ermöglicht Verbindungen mit Azure SQL-Datenbank, Azure SQL Managed Instance und Azure Synapse Analytics mit Verbundidentitäten in Microsoft Entra ID unter Verwendung eines Benutzernamens und Kennworts, der integrierten Windows-Authentifizierung oder einem Microsoft Entra-Zugriffstoken. Die PHP-Treiber für SQL Server unterstützen diese Features teilweise.

Bevor Sie die Microsoft Entra-Authentifizierung verwenden können, müssen Sie die Microsoft Entra-Authentifizierung mit Azure SQL konfigurieren und verwalten.

Wenn Sie Microsoft Entra ID nutzen möchten, verwenden Sie die Schlüsselwörter Authentication oder AccessToken (diese schließen sich gegenseitig aus), wie in der folgenden Tabelle gezeigt. Weitere technische Details finden Sie unter Verwenden von Microsoft Entra ID mit dem ODBC-Treiber.

Schlüsselwort Werte BESCHREIBUNG
AccessToken Nicht festgelegt (Standardeinstellung) Der Authentifizierungsmodus wird durch andere Schlüsselwörter bestimmt. Weitere Informationen finden Sie unter Connection Options.
Eine Bytezeichenfolge Das aus einer OAuth-JSON-Antwort extrahierte Microsoft Entra-Zugriffstoken. Die Verbindungszeichenfolge darf weder eine Benutzer-ID noch ein Kennwort noch das Schlüsselwort Authentication enthalten (erfordert die ODBC-Treiberversion 17 oder höher unter Linux oder macOS).
Authentifizierung Nicht festgelegt (Standardeinstellung) Der Authentifizierungsmodus wird durch andere Schlüsselwörter bestimmt. Weitere Informationen finden Sie unter Connection Options.
SqlPassword Direkte Authentifizierung bei einer SQL Server-Instanz (dies kann eine Azure-Instanz sein) unter Verwendung eines Benutzernamens und eines Kennworts. Benutzername und Kennwort müssen mit den Schlüsselwörtern UID und PWD an die Verbindungszeichenfolge übergeben werden.
ActiveDirectoryPassword Authentifizierung mit einer Microsoft Entra-Identität unter Verwendung eines Benutzernamens und eines Kennworts. Benutzername und Kennwort müssen mit den Schlüsselwörtern UID und PWD an die Verbindungszeichenfolge übergeben werden.
ActiveDirectoryMsi Authentifizierung über eine vom System oder vom Benutzer zugewiesene verwaltete Microsoft Entra-Identität (erfordert die ODBC-Treiberversion 17.3.1.1 oder höher). Eine Übersicht und Tutorials finden Sie unter Was sind verwaltete Identitäten für Azure-Ressourcen?.
ActiveDirectoryServicePrincipal Authentifizierung mithilfe von Dienstprinzipalobjekten (erfordert Version 17.7 oder höher des ODBC-Treibers). Weitere Informationen und Beispiele finden Sie unter Anwendungs- und Dienstprinzipalobjekte in Entra ID.

Das Schlüsselwort Authentication wirkt sich auf die Einstellungen der Verbindungssicherheit aus. Wenn dieses Schlüsselwort in der Verbindungszeichenfolge festgelegt ist, wird das Schlüsselwort Encrypt standardmäßig auf „true“ festgelegt. Das bedeutet, dass der Client eine Verschlüsselung anfordert. Darüber hinaus wird unabhängig von der Verschlüsselungseinstellung das Serverzertifikat überprüft, sofern nicht TrustServerCertificate auf „true“ festgelegt wird (die Standardeinstellung ist false). Dieses Feature unterscheidet sich von der alten, weniger sicheren Anmeldemethode, bei der das Serverzertifikat nur dann überprüft wird, wenn die Verschlüsselung in der Verbindungszeichenfolge explizit angefordert wird.

Einschränkungen

Unter Windows unterstützt der zugrunde liegende ODBC-Treiber einen weiteren Wert für das Schlüsselwort Authentication: ActiveDirectoryIntegrated. Allerdings unterstützen die PHP-Treiber diesen Wert auf keiner Plattform.

Beispiel: Herstellen einer Verbindung mithilfe von SqlPassword und ActiveDirectoryPassword

<?php
// First connect to a local SQL Server instance by setting Authentication to SqlPassword
$serverName = "myserver.mydomain";

$connectionInfo = array("UID"=>$myusername, "PWD"=>$mypassword, "Authentication"=>'SqlPassword');

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Authentication=SqlPassword.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=SqlPassword.\n";
    sqlsrv_close($conn);
}

// Now connect to an Azure SQL database by setting Authentication to ActiveDirectoryPassword
$azureServer = "myazureserver.database.windows.net";
$azureDatabase = "myazuredatabase";
$azureUsername = "myuid";
$azurePassword = "mypassword";
$connectionInfo = array("Database"=>$azureDatabase,
                        "UID"=>$azureUsername,
                        "PWD"=>$azurePassword,
                        "Authentication"=>'ActiveDirectoryPassword');

$conn = sqlsrv_connect($azureServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Authentication=ActiveDirectoryPassword.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=ActiveDirectoryPassword.\n";
    sqlsrv_close($conn);
}

?>

Beispiel: Herstellen einer Verbindung mithilfe des PDO_SQLSRV-Treibers

<?php
// First connect to a local SQL Server instance by setting Authentication to SqlPassword
$serverName = "myserver.mydomain";

$connectionInfo = "Database = $databaseName; Authentication = SqlPassword;";

try {
    $conn = new PDO("sqlsrv:server = $serverName ; $connectionInfo", $myusername, $mypassword);
    echo "Connected successfully with Authentication=SqlPassword.\n";
    $conn = null;
} catch (PDOException $e) {
    echo "Could not connect with Authentication=SqlPassword.\n";
    print_r($e->getMessage());
    echo "\n";
}

// Now connect to an Azure SQL database by setting Authentication to ActiveDirectoryPassword
$azureServer = "myazureserver.database.windows.net";
$azureDatabase = "myazuredatabase";
$azureUsername = "myuid";
$azurePassword = "mypassword";
$connectionInfo = "Database = $azureDatabase; Authentication = ActiveDirectoryPassword;";

try {
    $conn = new PDO("sqlsrv:server = $azureServer ; $connectionInfo", $azureUsername, $azurePassword);
    echo "Connected successfully with Authentication=ActiveDirectoryPassword.\n";
    unset($conn);
} catch (PDOException $e) {
    echo "Could not connect with Authentication=ActiveDirectoryPassword.\n";
    print_r($e->getMessage());
    echo "\n";
}
?>

Beispiel: Herstellen einer Verbindung mit Microsoft Entra-Zugriffstoken

SQLSRV-Treiber

<?php
// Using an access token to connect: do not use UID or PWD connection options
// Assume $accToken is the valid byte string extracted from an OAuth JSON response
$connectionInfo = array("Database"=>$azureAdDatabase, "AccessToken"=>$accToken);
$conn = sqlsrv_connect($azureAdServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Azure AD Access Token.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Azure AD Access Token.\n";
    sqlsrv_close($conn);
}
?>

PDO_SQLSRV-Treiber

<?php
try {
    // Using an access token to connect: do not pass in $uid or $pwd
    // Assume $accToken is the valid byte string extracted from an OAuth JSON response
    $connectionInfo = "Database = $azureAdDatabase; AccessToken = $accToken;";
    $conn = new PDO("sqlsrv:server = $azureAdServer; $connectionInfo");
    echo "Connected successfully with Azure AD Access Token\n";
    unset($conn);
} catch (PDOException $e) {
    echo "Could not connect with Azure AD Access Token.\n";
    print_r($e->getMessage());
    echo "\n";
}
?>

Beispiel: Herstellen einer Verbindung mithilfe von verwalteten Identitäten für Azure-Ressourcen

Verwenden der vom System zugewiesenen verwalteten Identität mit dem SQLSRV-Treiber

Wenn Sie mithilfe der vom System zugewiesenen verwalteten Identität eine Verbindung herstellen, verwenden Sie nicht die Optionen UID und PWD.

<?php

$azureServer = 'myazureserver.database.windows.net';
$azureDatabase = 'myazuredatabase';
$connectionInfo = array('Database'=>$azureDatabase,
                        'Authentication'=>'ActiveDirectoryMsi');
$conn = sqlsrv_connect($azureServer, $connectionInfo);

if ($conn === false) {
    echo "Could not connect with Authentication=ActiveDirectoryMsi (system-assigned).\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=ActiveDirectoryMsi (system-assigned).\n";
    
    $tsql = "SELECT @@Version AS SQL_VERSION";
    $stmt = sqlsrv_query($conn, $tsql);
    if ($stmt === false) {
        echo "Failed to run the simple query (system-assigned).\n";
        print_r(sqlsrv_errors());
    } else {
        while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            echo $row['SQL_VERSION'] . PHP_EOL;
        }

        sqlsrv_free_stmt($stmt);
    }
    
    sqlsrv_close($conn);
}
?>

Beispiel: Herstellen einer Verbindung mit Microsoft Entra-Dienstprinzipal

Zum Authentifizieren mithilfe eines Dienstprinzipalobjekts benötigen Sie die entsprechende Anwendungsclient-ID und den geheimen Clientschlüssel.

SQLSRV-Treiber

<?php

$adServer = 'myazureserver.database.windows.net';
$adDatabase = 'myazuredatabase';
$adSPClientId = 'myAppClientId';
$adSPClientSecret = 'myClientSecret';

$conn = false;
$connectionInfo = array("Database"=>$adDatabase, 
                        "Authentication"=>"ActiveDirectoryServicePrincipal",
                        "UID"=>$adSPClientId,
                        "PWD"=>$adSPClientSecret);

$conn = sqlsrv_connect($adServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect using Azure AD Service Principal." . PHP_EOL;
    print_r(sqlsrv_errors());
}

sqlsrv_close($conn);

?>

PDO_SQLSRV-Treiber

<?php

$adServer = 'myazureserver.database.windows.net';
$adDatabase = 'myazuredatabase';
$adSPClientId = 'myAppClientId';
$adSPClientSecret = 'myClientSecret';

$conn = false;
try {
    $connectionInfo = "Database = $adDatabase; Authentication = ActiveDirectoryServicePrincipal;";
    $conn = new PDO("sqlsrv:server = $adServer; $connectionInfo", $adSPClientId, $adSPClientSecret);
} catch (PDOException $e) {
    echo "Could not connect using Azure AD Service Principal.\n";
    print_r($e->getMessage());
    echo PHP_EOL;
}

unset($conn);
?>

Weitere Informationen

Verwenden von Microsoft Entra ID mit dem ODBC-Treiber

Was sind verwaltete Identitäten für Azure-Ressourcen?