使用 Microsoft Entra 驗證連線
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 = "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);
}
?>
範例 - 使用 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";
}
?>
範例 - 使用 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);
?>