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

Baixar driver do 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 sequência de bytes 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-se com uma identidade do Microsoft Entra usando um nome de usuário e uma 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.
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 Autentique-se usando objetos de entidade de serviço (requer o ODBC Driver versão 17.7 ou superior). Para obter mais detalhes e exemplos, consulte Objetos de aplicativo e de entidade de serviço no 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

Importante

A opção de autenticação ActiveDirectoryPassword (autenticação por senha do Microsoft Entra ID) foi preterida nos drivers SQL da Microsoft. Esse fluxo de autenticação de alto risco é incompatível com a MFA (autenticação multifator) Microsoft Entra obrigatória e pode não funcionar em locatários em que a MFA é imposta. Planeje migrar para um método de autenticação de Microsoft Entra diferente.

A autenticação por 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 conecte o usuário processando diretamente sua senha.

Microsoft recomenda que você não use o fluxo ROPC porque ele é incompatível com a MFA. 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. Use esse fluxo somente 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 houver um usuário presente no momento do logon, use a autenticação ActiveDirectoryInteractive ou ActiveDirectoryIntegrated para que a trilha de auditoria seja atribuída ao usuário que efetuou logon e as políticas de Acesso Condicional sejam aplicadas.

Para cenários não assistidos de serviço a serviço, siga as orientações sobre conta de serviço do Microsoft Entra:

  • Se o aplicativo é executado na infraestrutura do Azure, use ActiveDirectoryMSI (ou ActiveDirectoryManagedIdentity em alguns drivers). As identidades gerenciadas eliminam a sobrecarga de manutenção e rotação de segredos e certificados.
  • Se a identidade gerenciada não estiver disponível (por exemplo, o aplicativo será executado fora Azure), use ActiveDirectoryServicePrincipal. Quando o driver dá suporte a ele, prefira um certificado de cliente em vez de um segredo do cliente. Com um certificado, a chave privada permanece no cliente e apenas uma declaração assinada é enviada para Microsoft Entra para autenticar o cliente. Se a chave estiver armazenada em hardware (como um TPM ou HSM) ou marcada como não exportável, ela não poderá ser copiada para fora como uma cadeia de caracteres da mesma forma que um segredo do cliente pode.
  • Não use uma conta de usuário Microsoft Entra como uma conta de serviço.
<?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 usando a service principal 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?