Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Microsoft Entra ID é uma tecnologia central de gestão de ID de utilizador que funciona como alternativa à autenticação SQL Server. O Microsoft Entra ID permite ligações ao Base de Dados SQL do Azure, Azure SQL Managed Instance e Azure Synapse Analytics com identidades federadas no Microsoft Entra ID, usando um nome de utilizador e palavra-passe, Autenticação Integrada do Windows ou um token de acesso Microsoft Entra. Os drivers PHP para SQL Server oferecem suporte parcial para estas funcionalidades.
Antes de poder usar a autenticação Microsoft Entra, deve configurar e gerir a autenticação Microsoft Entra com SQL do Azure.
Para usar o Microsoft Entra ID, utilize as palavras-chave Authentication ou AccessToken (são mutuamente exclusivas), conforme mostrado na tabela seguinte. Para mais detalhes técnicos, consulte Utilização do Microsoft Entra ID com o Driver ODBC.
| Keyword | Valores | Description |
|---|---|---|
| AccessToken | Não definido (por defeito) | Modo de autenticação determinado por outras palavras-chave. Para mais informações, consulte Opções de Ligação. |
| Uma cadeia de bytes | Token de acesso Microsoft Entra extraído de uma resposta JSON do OAuth. A cadeia de ligação não deve conter ID de utilizador, palavra-passe ou a Authentication palavra-chave (requer o ODBC Driver versão 17 ou superior em Linux ou macOS). |
|
| Authentication | Não definido (por defeito) | Modo de autenticação determinado por outras palavras-chave. Para mais informações, consulte Opções de Ligação. |
SqlPassword |
Autenticar diretamente numa instância SQL Server (que pode ser uma instância Azure) usando um nome de utilizador e palavra-passe. O nome de utilizador e a palavra-passe devem ser passados para a cadeia de ligação usando as palavras-chave UID e PWD . | |
ActiveDirectoryPassword [DEPRECIADO] |
O ActiveDirectoryPassword está obsoleto. Para mais informações, veja Exemplo - ligar-se usando SqlPassword e ActiveDirectoryPassword. Autenticar com uma identidade Microsoft Entra usando um nome de utilizador e palavra-passe. O nome de utilizador e a palavra-passe devem ser passados para a cadeia de ligação usando as palavras-chave UID e PWD . |
|
ActiveDirectoryMsi |
Autenticar usando uma identidade gerida do Microsoft Entra atribuída pelo sistema ou atribuída por utilizador (requer o Driver ODBC versão 17.3.1.1 ou superior). Para uma visão geral e tutoriais, consulte O que são identidades geridas para recursos Azure?. | |
ActiveDirectoryServicePrincipal |
Autenticar usando objetos principais de serviço (requer o Driver ODBC versão 17.7 ou superior). Para mais detalhes e exemplos, consulte os objetos principais de aplicação e serviço no Microsoft Entra ID. |
A palavra-chave Autenticação afeta as definições de segurança da ligação. Se estiver definida na string de ligação, então por defeito a palavra-chave Encrypt está definida como true, o que significa que o cliente irá pedir encriptação. Além disso, o certificado do servidor será validado independentemente da configuração de encriptação, a menos que o TrustServerCertificate esteja definido como true (falso por defeito). Esta funcionalidade distingue-se do antigo método de login menos seguro, em que o certificado do servidor só é validado quando a encriptação é especificamente solicitada na cadeia de ligação.
Limitações
No Windows, o driver ODBC subjacente suporta mais um valor para a palavra-chave de Autenticação , ActiveDirectoryIntegrated, mas os drivers PHP não suportam este valor em nenhuma plataforma.
Exemplo - liga-te usando SqlPassword e ActiveDirectoryPassword
Importante
A opção de autenticação ActiveDirectoryPassword (autenticação por palavra-passe do Microsoft Entra ID) está obsoleta nos drivers SQL da Microsoft. Este fluxo de autenticação de alto risco é incompatível com a autenticação multifator (MFA) obrigatória da Microsoft Entra e pode não funcionar em inquilinos onde a MFA é aplicada. Planeio migrar para um método de autenticação Microsoft Entra diferente.
A autenticação por palavra-passe do Microsoft Entra ID baseia-se na concessão OAuth 2.0 Resource Owner Password Credentials (ROPC), que permite a uma aplicação iniciar a sessão do utilizador processando diretamente a respetiva palavra-passe.
A Microsoft recomenda que não uses o fluxo ROPC porque é incompatível com o MFA. Na maioria dos cenários, alternativas mais seguras estão disponíveis e são recomendadas. Este fluxo exige um elevado grau de confiança na aplicação e acarreta riscos que não existem noutros fluxos. Use este fluxo apenas quando fluxos mais seguros não forem viáveis. A Microsoft está a afastar-se deste fluxo de autenticação de alto risco para proteger os utilizadores de ataques maliciosos. Para mais informações, consulte Planeamento para autenticação multifator obrigatória para Azure.
Quando um utilizador estiver presente no início de sessão, utilize a autenticação ActiveDirectoryInteractive ou ActiveDirectoryIntegrated para que o registo de auditoria seja atribuído ao utilizador com sessão iniciada e as políticas de Acesso Condicional se apliquem.
Para cenários de serviço para serviço não supervisionados, siga as orientações sobre contas de serviço do Microsoft Entra:
- Se a sua aplicação correr na infraestrutura Azure, use o ActiveDirectoryMSI (ou o ActiveDirectoryManagedIdentity em alguns drivers). As identidades geridas eliminam a sobrecarga de manter e rotacionar segredos e certificados.
- Se a identidade gerida não estiver disponível (por exemplo, se a aplicação estiver a ser executada fora do Azure), use o ActiveDirectoryServicePrincipal. Quando o driver o permite, prefira um certificado de cliente em vez de um segredo de cliente. Com um certificado, a chave privada permanece no cliente e apenas uma asserção assinada é enviada à 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, não pode ser extraída sob a forma de uma cadeia de caracteres, da mesma forma que um segredo do cliente pode.
- Não use uma conta de utilizador Microsoft Entra como 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 - liga-te 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 - ligar-se usando o token de acesso 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);
}
?>
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";
}
?>
Exemplo - ligar usando identidades geridas para recursos Azure
Usando a identidade gerida pelo sistema associada ao driver SQLSRV
Ao ligar-se usando a identidade gerida atribuída ao sistema, não utilize 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 o service principal do Microsoft Entra
Para autenticar usando um objeto principal de serviço, será necessário o correspondente ID do cliente da aplicação 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);
?>