Compartilhar via


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 [PRETERIDO] ActiveDirectoryPassword foi preterido. Para obter mais informações, consulte Exemplo – conectar usando SqlPassword e 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

Observação

A opção de autenticação ActiveDirectoryPassword (Autenticação de Senha Microsoft Entra ID) foi descontinuada.

A senha do Microsoft Entra ID baseia-se na concessão ROPC (Credenciais de Senha do Proprietário do Recurso do OAuth 2.0), que permite que um aplicativo faça login para o usuário manipulando diretamente sua senha.

A Microsoft recomenda que você não use o fluxo ROPC; é incompatível com a MFA (autenticação multifator). Na maioria dos cenários, alternativas mais seguras estão disponíveis e recomendadas. Esse fluxo requer um alto grau de confiança no aplicativo e traz riscos que não estão presentes em outros fluxos. Você só deve usar esse fluxo quando fluxos mais seguros não forem viáveis. A Microsoft está se afastando desse fluxo de autenticação de alto risco para proteger os usuários contra ataques mal-intencionados. Para obter mais informações, consulte Planning for mandatory multifactor authentication for Azure.

Quando o contexto do usuário estiver disponível, use a autenticação ActiveDirectoryInteractive.

Quando o contexto do usuário não estiver disponível e seu aplicativo estiver em execução na infraestrutura do Azure, use ActiveDirectoryMSI (ou ActiveDirectoryManagedIdentity em alguns drivers). A Identidade Gerenciada elimina a sobrecarga de manutenção e rotação de segredos e certificados. Se você não puder usar uma Identidade Gerenciada, use a autenticação do ActiveDirectoryServicePrincipal.

Aviso

Não use a autenticação do Principal de Serviço quando um contexto de usuário estiver disponível. O acesso somente ao aplicativo é inerentemente de alto privilégio, geralmente concedendo acesso a todo o locatário e potencialmente permitindo que um ator incorreto acesse os dados do cliente para qualquer usuário.

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

?>

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

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?