Connettersi usando l'autenticazione di Microsoft Entra

Download del driver PHP

Microsoft Entra ID è una tecnologia di gestione degli ID utente centrale che funge da alternativa all'autenticazione di SQL Server. Microsoft Entra ID consente le connessioni al database SQL di Azure, all’istanza gestita di SQL di Azure e ad Azure Synapse Analytics con identità federate in Microsoft Entra ID che usano un nome utente e una password, l'autenticazione integrata di Windows o un token di accesso di Microsoft Entra. I driver PHP per SQL Server offrono un supporto parziale per queste funzionalità.

Prima di poter usare l'autenticazione di Microsoft Entra, è necessario configurare e gestire l'autenticazione di Microsoft Entra con Azure SQL.

Per usare Microsoft Entra ID, usare le parole chiave Authentication o AccessToken (si escludono a vicenda), come illustrato nella tabella seguente. Per informazioni più tecniche, vedere Come usare Microsoft Entra ID con il driver ODBC.

Parola chiave Valori Descrizione
AccessToken Non impostata (impostazione predefinita) Modalità di autenticazione determinata da altre parole chiave. Per altre informazioni, vedere Connection Options.
Una stringa di byte Token di accesso di Microsoft Entra estratto da una risposta JSON OAuth. La stringa di connessione non deve contenere l'ID utente, la password o la parola chiave Authentication (richiede il driver ODBC versione 17 o successiva in Linux o macOS).
Autenticazione Non impostata (impostazione predefinita) Modalità di autenticazione determinata da altre parole chiave. Per altre informazioni, vedere Connection Options.
SqlPassword Eseguire l'autenticazione direttamente in un'istanza di SQL Server (che può essere un'istanza di Azure) usando un nome utente e una password. Il nome utente e la password devono essere passati nella stringa di connessione usando le parole chiave UID e PWD.
ActiveDirectoryPassword Eseguire l'autenticazione con un'identità Microsoft Entra usando un nome utente e una password. Il nome utente e la password devono essere passati nella stringa di connessione usando le parole chiave UID e PWD.
ActiveDirectoryMsi Eseguire l'autenticazione usando un'identità gestita Microsoft Entra assegnata dal sistema o un'identità gestita assegnata dall'utente (richiede il driver ODBC versione 17.3.1.1 o successiva). Per una panoramica e le esercitazioni, vedere Informazioni sulle identità gestite per le risorse di Azure.
ActiveDirectoryServicePrincipal Eseguire l'autenticazione con oggetti entità servizio (è richiesto il driver ODBC versione 17.7 o successiva). Per altri dettagli ed esempi, vedere Oggetti applicazione e oggetti entità servizio in Microsoft Entra ID.

La parola chiave Authentication influisce sulle impostazioni di sicurezza della connessione. Se è impostata nella stringa di connessione, per impostazione predefinita la parola chiave Encrypt è impostata su true, ovvero il client richiede la crittografia. Inoltre, il certificato del server verrà convalidato indipendentemente dall'impostazione di crittografia, a meno che TrustServerCertificate non sia impostato su true (l'impostazione predefinita è false). Questa funzionalità si distingue dal metodo di accesso precedente, meno sicuro, in cui il certificato del server viene convalidato solo quando la crittografia è richiesta in modo specifico nella stringa di connessione.

Limiti

In Windows, sebbene il driver ODBC sottostante supporti un ulteriore valore per la parola chiave Authentication, ovvero ActiveDirectoryIntegrated, i driver PHP non supportano il valore in alcuna piattaforma.

Esempio: connettersi usando SqlPassword e 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);
}

?>

Esempio: connettersi usando il driver PDO_SQLSRV

<?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";
}
?>

Esempio: connettersi con un token di accesso Microsoft Entra

Driver SQLSRV

<?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);
}
?>

Driver PDO_SQLSRV

<?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";
}
?>

Esempio: connettersi usando le identità gestite per le risorse di Azure

Uso dell'identità gestita assegnata dal sistema con il driver SQLSRV

Quando ci si connette usando l'identità gestita assegnata dal sistema, non usare le opzioni UID o 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);
}
?>

Esempio: connettersi con un'entità servizio Microsoft Entra

Per eseguire l'autenticazione usando un oggetto entità servizio, sono necessari i valori corrispondenti di ID client applicazione e segreto client.

Driver SQLSRV

<?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);

?>

Driver PDO_SQLSRV

<?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);
?>

Vedi anche

Come usare Microsoft Entra ID con il Driver ODBC

Informazioni sulle identità gestite per le risorse di Azure