Microsoft Entra ID 是一種中央使用者識別碼管理技術,可作為 SQL Server 驗證的替代方案。 Microsoft Entra ID 允許使用使用者名稱與密碼、Windows 整合式驗證或Microsoft Entra ID 存取權杖,透過Microsoft Entra ID 中的 同盟 識別身分來連線到 Azure SQL 資料庫、Azure SQL 受控執行個體和 Azure Synapse Analytics 。 PHP Drivers for SQL Server 會提供這些功能的部分支援。
使用 Microsoft Entra 驗證之前,您必須 使用 Azure SQL 設定和管理 Microsoft Entra 驗證。
若要使用 Microsoft Entra ID,請使用 Authentication 或 AccessToken 關鍵字 (它們彼此互斥),如下表所示。 如需更多的技術詳細資料,請參閱搭配 ODBC 驅動程式使用 Microsoft Entra ID。
| 關鍵字 | 值 | 描述 |
|---|---|---|
| AccessToken | 未設定 (預設值) | 由其他關鍵字決定的驗證模式。 如需詳細資訊,請參閱 Connection Options。 |
| 位元組字串 | 從 OAuth JSON 回應中擷取的 Microsoft Entra 存取權杖。 連接字串不能包含使用者識別碼、密碼或Authentication關鍵字 (在 Linux 或 macOS 中需要 ODBC 驅動程式 17 版或更新版本)。 |
|
| 驗證 | 未設定 (預設值) | 由其他關鍵字決定的驗證模式。 如需詳細資訊,請參閱 Connection Options。 |
SqlPassword |
利用使用者名稱與密碼直接向 SQL Server 執行個體 (可能是 Azure 執行個體) 進行驗證。 使用者名稱與密碼必須使用 UID 和 PWD 關鍵字,傳遞至連接字串。 | |
ActiveDirectoryPassword |
使用使用者名稱和密碼透過 Microsoft Entra 身分識別進行驗證。 使用者名稱與密碼必須使用 UID 和 PWD 關鍵字,傳遞至連接字串。 | |
ActiveDirectoryMsi |
使用Microsoft Entra系統指派或使用者指派的受控識別 (需要 17.3.1.1 版或更新版本的 ODBC 驅動程式) 來進行驗證。 如需概觀和教學課程,請參閱什麼是適用於 Azure 資源的受控識別?。 | |
ActiveDirectoryServicePrincipal |
使用服務主體物件進行驗證 (需要 ODBC 驅動程式 17.7 版或更新版本)。 如需詳細資料和範例,請參考 Microsoft Entra ID 中的應用程式和服務主體物件。 |
Authentication 關鍵字會影響連線安全性設定。 如果是在連接字串中設定,則根據預設,Encrypt 關鍵字會設定為 true,這表示用戶端會要求加密。 此外,除非 TrustServerCertificate 設定為 true (預設為 false),否則無論加密設定如何,都將會驗證伺服器憑證。 這項功能與舊版、較不安全的登入方法有區別,只有在連接字串中特別要求加密時,才會驗證伺服器憑證。
限制
在 Windows 上,底層 ODBC 驅動程式針對 Authentication 關鍵字還支援另一個值 ActiveDirectoryIntegrated,但 PHP 驅動程式在任何平台上都不支援此值。
範例 - 使用 SqlPassword 和 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);
}
?>
範例 - 使用 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";
}
?>
範例 - 使用 Microsoft Entra 存取權杖進行連線
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);
}
?>
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";
}
?>
範例 - 使用適用於 Azure 資源的受控識別進行連線
搭配 SQLSRV 驅動程式使用系統指派的受控識別
使用系統指派的受控識別進行連線時,請勿使用 [UID] 或 [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);
}
?>
範例 - 使用 Microsoft Entra 服務主體進行連線
如需使用服務主體物件進行驗證,您需要對應的 應用程式用戶端識別碼和用戶端密碼。
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);
?>
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);
?>