Microsoft Entra 認証を使用して接続する

PHP ドライバーのダウンロード

Microsoft Entra ID は、SQL Server 認証の代替手段として機能する、集中ユーザー ID 管理テクノロジです。 Microsoft Entra ID では、ユーザー名とパスワード、Windows 統合認証、または Microsoft Entra アクセストークンを使用して、Azure SQL データベース、Azure SQL Managed Instance、および Azure Synapse Analytics にフェデレーション ID で接続できます。 SQL Server 用の PHP ドライバーでは、これらの機能が部分的にサポートされます。

Microsoft Entra 認証を使用するには、Azure SQL で Microsoft Entra 認証を構成して管理する必要があります

Microsoft Entra ID を使用するには、次の表で示すように、Authentication または AccessToken キーワードを使用します (どちらか一方)。 技術的な詳細については、「ODBC ドライバーでの Microsoft Entra ID の使用」をご覧ください。

Keyword 説明
AccessToken 非設定 (既定値) 他のキーワードによって決定される認証モード。 詳細については、「 Connection Options」を参照してください。
バイト文字列 OAuth JSON の応答から抽出された Microsoft Entra アクセス トークン。 接続文字列に、ユーザー ID、パスワード、または Authentication キーワードを含めることはできません (Linux または macOS では、ODBC Driver バージョン 17 以降が必要です)。
認証 非設定 (既定値) 他のキーワードによって決定される認証モード。 詳細については、「 Connection Options」を参照してください。
SqlPassword ユーザー名とパスワードを使用して、SQL Server インスタンス (Azure インスタンスである可能性があります) に対して直接認証を行います。 UIDPWD キーワードを使用して、ユーザー名とパスワードを接続文字列に渡す必要があります。
ActiveDirectoryPassword ユーザー名とパスワードを使用して Microsoft Entra ID で認証します。 UIDPWD キーワードを使用して、ユーザー名とパスワードを接続文字列に渡す必要があります。
ActiveDirectoryMsi Microsoft Entra のシステム割り当てのユーザー割り当てマネージド ID のいずれかを使用して、認証を行います (ODBC ドライバー バージョン 17.3.1.1 以降が必要です)。 概要とチュートリアルについては、「Azure リソース用マネージド ID とは」を参照してください。
ActiveDirectoryServicePrincipal サービス プリンシパル オブジェクトによる認証 (ODBC Driver バージョン 17.7 以降が必要)。 詳細については、「Microsoft Entra ID プラットフォームのアプリケーションとサービス プリンシパル オブジェクト」に関するページを参照してください。

Authentication キーワードは、接続のセキュリティ設定に影響します。 それが接続文字列で設定されている場合、既定で Encrypt キーワードが true に設定されます。これは、クライアントが暗号化を要求することを意味します。 さらに、TrustServerCertificate が true に設定されていない限り (既定では false)、暗号化の設定に関係なくサーバー証明書が検証されます。 この機能は、接続文字列で暗号化が明示的に要求されている場合にのみサーバー証明書が検証される、セキュリティが劣る古いログイン方法とは異なります。

制限事項

Windows では、基になる ODBC ドライバーで Authentication キーワードに対してもう 1 つの値 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 リソースのマネージド ID を使用して接続する

SQLSRV ドライバーでシステム割り当てのマネージド ID を使用する

システム割り当てのマネージド ID を使用して接続する場合は、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 サービス プリンシパルを使用して接続する

サービス プリンシパル オブジェクトを使用して認証するには、対応するアプリケーション クライアント IDクライアント シークレットが必要です。

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

参照

ODBC ドライバードライバー で Microsoft Entra ID を使用する

Azure リソースのマネージド ID とは