Condividi tramite


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 [DEPRECATO] "ActiveDirectoryPassword" è obsoleto. Per altre informazioni, vedere Esempio di connessione con SqlPassword e 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

Annotazioni

L'opzione di autenticazione ActiveDirectoryPassword (autenticazione password ID Microsoft Entra) è deprecata.

La password dell'ID Microsoft Entra si basa sulla concessione di credenziali della password del proprietario della risorsa OAuth 2.0 (ROPC), che consente a un'applicazione di accedere all'utente gestendo direttamente la password.

Microsoft consiglia di non usare il flusso ROPC; non è compatibile con l'autenticazione a più fattori (MFA). Nella maggior parte degli scenari sono disponibili alternative più sicure e consigliate. Questo flusso richiede un elevato livello di attendibilità nell'applicazione e comporta rischi che non sono presenti in altri flussi. È consigliabile usare questo flusso solo quando i flussi più sicuri non sono validi. Microsoft si sta allontanando da questo flusso di autenticazione ad alto rischio per proteggere gli utenti da attacchi dannosi. Per altre informazioni, vedere Pianificazione dell'autenticazione a più fattori obbligatoria per Azure.

Quando il contesto utente è disponibile, usare l'autenticazione ActiveDirectoryInteractive.

Quando il contesto utente non è disponibile e l'app è in esecuzione nell'infrastruttura di Azure, usare ActiveDirectoryMSI (o ActiveDirectoryManagedIdentity in alcuni driver). L'identità gestita elimina il sovraccarico di gestione e rotazione di segreti e certificati. Se non è possibile usare l'identità gestita, usare l'autenticazione del servizio principale di Active Directory.

Avvertimento

Non usare l'autenticazione del Service Principal quando è disponibile un contesto utente. L'accesso solo app è intrinsecamente con privilegi elevati, spesso concedendo l'accesso a livello di tenant e consentendo potenzialmente a un attore malintenzionato di accedere ai dati dei clienti per qualsiasi utente.

<?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 = "<password>";
$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 = "<password>";
$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