Udostępnij przez


Łączenie z użyciem uwierzytelniania Microsoft Entra

Pobieranie sterownika PHP

Microsoft Entra ID to centralna technologia zarządzania identyfikatorami użytkowników, która działa jako alternatywa dla uwierzytelniania programu SQL Server. Identyfikator Entra firmy Microsoft umożliwia nawiązywanie połączeń z usługą Azure SQL Database, usługą Azure SQL Managed Instance i usługą Azure Synapse Analytics przy użyciu tożsamości federacyjnych w usłudze Microsoft Entra ID przy użyciu nazwy użytkownika i hasła, zintegrowanego uwierzytelniania systemu Windows lub tokenu dostępu firmy Microsoft Entra. Sterowniki JĘZYKA PHP dla programu SQL Server oferują częściową obsługę tych funkcji.

Przed rozpoczęciem korzystania z uwierzytelniania w usłudze Microsoft Entra należy skonfigurować uwierzytelnianie entra firmy Microsoft i zarządzać nim za pomocą usługi Azure SQL.

Aby użyć identyfikatora Entra firmy Microsoft, użyj słów kluczowych Authentication lub AccessToken (są one wzajemnie wykluczające się), jak pokazano w poniższej tabeli. Aby uzyskać więcej informacji technicznych, zobacz Using Microsoft Entra ID with the ODBC Driver (Używanie identyfikatora Entra firmy Microsoft ze sterownikiem ODBC).

Keyword Wartości Description
AccessToken Nie ustawiono (ustawienie domyślne) Tryb uwierzytelniania określany przez inne słowa kluczowe. Aby uzyskać więcej informacji, zobacz Opcje połączenia.
Ciąg bajtowy Token dostępu firmy Microsoft Entra wyodrębniony z odpowiedzi OAuth JSON. Parametry połączenia nie mogą zawierać identyfikatora użytkownika, hasła ani słowa kluczowego Authentication (wymaga sterownika ODBC w wersji 17 lub nowszej w systemie Linux lub macOS).
Uwierzytelnianie Nie ustawiono (ustawienie domyślne) Tryb uwierzytelniania określany przez inne słowa kluczowe. Aby uzyskać więcej informacji, zobacz Opcje połączenia.
SqlPassword Bezpośrednie uwierzytelnianie do instancji SQL Server, która może być instancją na platformie Azure, przy użyciu nazwy użytkownika i hasła. Nazwa użytkownika i hasło muszą zostać przekazane do ciągu połączenia przy użyciu słów kluczowych UID i PWD.
ActiveDirectoryPassword Uwierzytelnij się za pomocą tożsamości Microsoft Entra, używając nazwy użytkownika i hasła. Nazwa użytkownika i hasło muszą zostać przekazane do ciągu połączenia przy użyciu słów kluczowych UID i PWD.
ActiveDirectoryMsi Uwierzytelnianie przy użyciu zarządzanej tożsamości Microsoft Entra przypisanej przez system lub przypisanej przez użytkownika (wymaga sterownika ODBC w wersji 17.3.1.1 lub nowszej). Aby zapoznać się z omówieniem i samouczkami, zapoznaj się z tematem Co to są tożsamości zarządzane dla zasobów platformy Azure?.
ActiveDirectoryServicePrincipal Uwierzytelnianie przy użyciu obiektów jednostki usługi (wymaga sterownika ODBC w wersji 17.7 lub nowszej). Aby uzyskać więcej szczegółów i przykładów, zapoznaj się z tematem Application and service principal objects in Microsoft Entra ID (Obiekty aplikacji i jednostki usługi w identyfikatorze Entra firmy Microsoft).

Słowo kluczowe Uwierzytelnianie ma wpływ na ustawienia zabezpieczeń połączenia. Jeśli jest ustawiona w parametrach połączenia, domyślnie słowo kluczowe Szyfruj ma wartość true, co oznacza, że klient zażąda szyfrowania. Ponadto certyfikat serwera zostanie zweryfikowany niezależnie od ustawienia szyfrowania, chyba że właściwość TrustServerCertificate jest ustawiona na true (wartość false domyślnie). Ta funkcja jest rozróżniana od starej, mniej bezpiecznej metody logowania, w której certyfikat serwera jest weryfikowany tylko wtedy, gdy szyfrowanie jest specjalnie żądane w parametrach połączenia.

Ograniczenia

W systemie Windows podstawowy sterownik ODBC obsługuje jeszcze jedną wartość słowa kluczowego Authentication, ActiveDirectoryIntegrated, ale sterowniki PHP nie obsługują tej wartości na żadnej platformie.

Przykład — nawiązywanie połączenia przy użyciu poleceń SqlPassword i 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 = "<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);
}

?>

Przykład — nawiązywanie połączenia przy użyciu sterownika 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";
}
?>

Przykład — nawiązywanie połączenia przy użyciu tokenu dostępu firmy Microsoft Entra

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

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

Przykład — nawiązywanie połączenia przy użyciu tożsamości zarządzanych dla zasobów platformy Azure

Używanie przypisanej przez system tożsamości zarządzanej ze sterownikiem SQLSRV

Podczas nawiązywania połączenia przy użyciu tożsamości zarządzanej przypisanej przez system nie należy używać opcji UID lub 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);
}
?>

Przykład — nawiązywanie połączenia przy użyciu jednostki usługi Microsoft Entra

Aby uwierzytelnić się przy użyciu obiektu jednostki usługi, musisz mieć odpowiedni identyfikator klienta aplikacji i klucz tajny klienta.

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

?>

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

Zobacz też

Używanie Microsoft Entra ID ze sterownikiem ODBC

Co to są tożsamości zarządzane dla zasobów platformy Azure?