Conexión mediante la autenticación de Microsoft Entra

Descargar controlador PHP

Microsoft Entra ID es una tecnología de administración de Id. de usuario central que funciona como alternativa a la autenticación de SQL Server. Microsoft Entra ID permite las conexiones a la base de datos de Azure SQL, Azure SQL Managed Instance y Azure Synapse Analytics con identidades federadas en Microsoft Entra ID mediante un nombre de usuario y una contraseña, Autenticación integrada de Windows o un token de acceso de Microsoft Entra. Los controladores PHP para SQL Server ofrecen compatibilidad parcial con estas características.

Para poder usar la autenticación de Microsoft Entra, debes configurar y administrar la autenticación de Microsoft Entra con Azure SQL.

Para usar Microsoft Entra ID, usa las palabras clave Authentication o AccessToken (se excluyen mutuamente), tal como se muestra en la siguiente tabla. Para obtener detalles más técnicos, consulta Uso de Microsoft Entra ID con el controlador ODBC.

Palabra clave Valores Descripción
AccessToken Sin establecer (valor predeterminado) Modo de autenticación determinado por otras palabras clave. Para obtener más información, consulte Connection Options.
Una cadena de bytes El token de acceso de Microsoft Entra extraído de una respuesta JSON OAuth. La cadena de conexión no debe contener ningún Id. de usuario, ninguna contraseña o la palabra clave Authentication (requiere la versión 17 del controlador ODBC o una versión posterior en Linux o macOS).
Autenticación Sin establecer (valor predeterminado) Modo de autenticación determinado por otras palabras clave. Para obtener más información, consulte Connection Options.
SqlPassword Autentíquese directamente en una instancia de SQL Server (que puede ser una instancia de Azure) mediante un nombre de usuario y una contraseña. El nombre de usuario y la contraseña deben pasarse a la cadena de conexión mediante las palabras clave UID y PWD.
ActiveDirectoryPassword Autentícate con una identidad de Microsoft Entra mediante un nombre de usuario y una contraseña. El nombre de usuario y la contraseña deben pasarse a la cadena de conexión mediante las palabras clave UID y PWD.
ActiveDirectoryMsi Autentícate mediante una identidad administrada asignada por el sistema de Microsoft Entra o una identidad administrada asignada por el usuario (requiere la versión 17.3.1.1 del controlador ODBC o una versión posterior). Para obtener información general y tutoriales, consulta ¿Qué son las identidades administradas para recursos de Azure?.
ActiveDirectoryServicePrincipal Autentíquese con objetos de entidad de servicio (requiere la versión 17.7 del controlador ODBC o una versión posterior). Para obtener más información y ejemplos, consulta el artículo Objetos de aplicación y de entidad de servicio en Microsoft Entra ID.

La palabra clave Authentication afecta a la configuración de seguridad de la conexión. Si se establece en la cadena de conexión, la palabra clave Encrypt se establecerá en true de forma predeterminada, lo que significa que el cliente solicitará el cifrado. Además, el certificado de servidor se validará con independencia de la configuración de cifrado a menos que TrustServerCertificate se establezca en true (false de forma predeterminada). Esta característica se distingue del método de inicio de sesión anterior y menos seguro, en el que el certificado de servidor se valida solo cuando se solicita de forma específica en la cadena de conexión.

Limitaciones

En Windows, el controlador ODBC subyacente admite un valor más para la palabra clave Authentication, ActiveDirectoryIntegrated, pero los controladores PHP no admiten este valor en ninguna plataforma.

Ejemplo: conexión mediante SqlPassword y 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);
}

?>

Ejemplo: conexión mediante el controlador 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";
}
?>

Ejemplo: conexión mediante el token de acceso de Microsoft Entra

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

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

Ejemplo: conexión mediante identidades administradas para recursos de Azure

Uso de la identidad administrada asignada por el sistema con el controlador SQLSRV

Al conectarse mediante la identidad administrada asignada por el sistema, no use las opciones UID o 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);
}
?>

Ejemplo: conexión mediante la entidad de servicio de Microsoft Entra

Para autenticarse mediante un objeto de entidad de servicio, necesitará el identificador de cliente de la aplicación que corresponda y el secreto de cliente.

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

?>

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

Consulte también

Uso de Microsoft Entra ID con el controlador ODBC

¿Qué son las identidades administradas de los recursos de Azure?