Conectar-se usando a autenticação do Microsoft Entra

Baixar driver PHP

O Microsoft Entra ID é uma tecnologia de gerenciamento de ID de usuário central que funciona como uma alternativa para a autenticação do SQL Server. O Microsoft Entra ID permite conexões com banco de dados SQL do Azure, Instância Gerenciada de SQL do Azure e Azure Synapse Analytics com identidades federadas no Microsoft Entra ID usando um nome de usuário e senha, autenticação integrada do Windows ou um token de acesso do Microsoft Entra. Os drivers do PHP para SQL Server oferecem suporte parcial para esses recursos.

Antes de usar a autenticação Microsoft Entra com SQL do Azure, é necessário configurar e gerenciar a autenticação Microsoft Entra com SQL do Azure.

Para usar o Microsoft Entra ID, use as palavras-chave Authentication ou AccessToken (elas são mutuamente exclusivas), conforme mostrado na tabela a seguir. Para obter mais detalhes técnicos, confira Usar o Microsoft Entra ID com o Driver ODBC.

Palavra-chave Valores Descrição
AccessToken Não definido (padrão) Modo de autenticação determinado por outras palavras-chave. Para obter mais informações, consulte Connection Options.
Uma cadeia de caracteres de byte O token de acesso do Microsoft Entra extraído de uma resposta JSON do OAuth. A cadeia de conexão não deve conter a ID de usuário, a senha ou a palavra-chave de Authentication (requer o Driver ODBC versão 17 ou superior no Linux ou no macOS).
Autenticação Não definido (padrão) Modo de autenticação determinado por outras palavras-chave. Para obter mais informações, consulte Connection Options.
SqlPassword Autentique diretamente em uma instância do SQL Server (que pode ser uma instância do Azure) usando um nome de usuário e senha. O nome de usuário e a senha devem ser passados para a cadeia de conexão usando as palavras-chave UID e PWD.
ActiveDirectoryPassword Autentique com o nome de usuário e a senha de uma identidade do Microsoft Entra O nome de usuário e a senha devem ser passados para a cadeia de conexão usando as palavras-chave UID e PWD.
ActiveDirectoryMsi Autentique usando uma identidade gerenciada atribuída pelo sistema do Microsoft Entra ou uma identidade gerenciada atribuída pelo usuário (requer o Driver ODBC versão 17.3.1.1 ou superior). Para obter uma visão geral e tutoriais, consulte O que são identidades gerenciadas para recursos do Azure?.
ActiveDirectoryServicePrincipal Execute uma autenticação usando objetos da entidade de serviço (requer obter um Driver ODBC versão 17.7 ou posterior). Para obter mais detalhes e exemplos, confira o artigo Objetos do aplicativo e da entidade de serviço do Microsoft Entra ID.

A palavra-chave Autenticação afeta as configurações de segurança da conexão. Se ela for definida na cadeia de conexão, então, por padrão, a palavra-chave Criptografar será definida como true, o que significa que o cliente solicitará criptografia. Além disso, o certificado do servidor será validado independentemente da configuração de criptografia, a menos que TrustServerCertificate seja definido como true (ele é false por padrão). Esse recurso é diferenciado do método de logon antigo e menos seguro, no qual o certificado do servidor é validado somente quando a criptografia é expressamente solicitada na cadeia de conexão.

Limitações

No Windows, o driver ODBC subjacente é compatível com mais um valor para a palavra-chave Autenticação, ActiveDirectoryIntegrated, mas os drivers PHP não são compatíveis com esse valor em nenhuma plataforma.

Exemplo – conectar usando SqlPassword e 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);
}

?>

Exemplo – conectar usando o 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 = "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";
}
?>

Exemplo: conectar-se usando o token de acesso do 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";
}
?>

Exemplo – conectar usando identidades gerenciadas para recursos do Azure

Usar a identidade gerenciada atribuída pelo sistema com o driver SQLSRV

Ao se conectar usando a identidade gerenciada atribuída pelo sistema, não use as opções UID ou 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);
}
?>

Exemplo: conectar-se usando a entidade de serviço do Microsoft Entra

Para executar uma autenticação usando um objeto da entidade de serviço, será necessário obter a ID de cliente do aplicativo e o segredo do cliente.

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

Confira também

Usar Microsoft Entra ID com o driver ODBC

O que são identidades gerenciadas para recursos do Azure?