Uso de Microsoft Entra ID

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase de datos SQL en Microsoft Fabric

Descargar controlador OLE DB

Propósito

A partir de la versión 18.2.1, Microsoft OLE DB Driver for SQL Server permite que las aplicaciones OLE DB se conecten a la base de datos de Azure SQL, Azure SQL Managed Instance, Azure Synapse Analytics y Microsoft Fabric mediante una identidad federada.

Los métodos de autenticación de Microsoft Entra son:

  • Nombre de usuario y contraseña
  • Token de acceso
  • Autenticación integrada

La versión 18.3.0 agrega compatibilidad con los siguientes métodos de autenticación de Microsoft Entra:

La versión 18.5.0 agrega compatibilidad con los siguientes métodos de autenticación:

  • Autenticación del principal de servicio de Microsoft Entra

Nota:

No se admite el uso de los siguientes modos de autenticación con DataTypeCompatibility (o su propiedad correspondiente) configurada en 80no admitido.

  • Autenticación de Microsoft Entra mediante el nombre de usuario y la contraseña
  • Autenticación de Microsoft Entra mediante token de acceso
  • Autenticación integrada de Microsoft Entra
  • Autenticación interactiva de Microsoft Entra
  • Autenticación de identidades administradas de Microsoft Entra
  • Autenticación del principal de servicio de Microsoft Entra

Para usar la autenticación de Microsoft Entra, debes configurar el origen de datos de Azure SQL. Para obtener más información, consulte Configuración y administración de la autenticación de Microsoft Entra con Azure SQL.

Palabras clave de cadena de conexión y propiedades

Se han agregado las siguientes palabras clave de cadena de conexión para admitir la autenticación de Microsoft Entra:

Palabra clave de cadena de conexión Propiedad de Conexión Descripción
Token de acceso SSPROP_AUTH_ACCESS_TOKEN Especifica un token de acceso para autenticarse en microsoft Entra ID.
Autenticación SSPROP_AUTH_MODE Especifica el método de autenticación que se va a utilizar.

Para más información sobre las nuevas palabras clave y propiedades, consulte:

Cifrado y validación de certificados

Consulte Cifrado y validación de certificados para obtener más información.

Adiciones de GUI

La interfaz gráfica de usuario del driver se ha mejorado para permitir la autenticación de Microsoft Entra. Para más información, vea:

Ejemplos de cadena de conexión

En esta sección se muestran ejemplos de palabras clave de cadena de conexión nuevas y existentes que se van a utilizar con IDataInitialize::GetDataSource y la propiedad DBPROP_INIT_PROVIDERSTRING.

Autenticación SQL

  • Usando IDataInitialize::GetDataSource
    • Nuevo:

      Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=SqlPassword; User ID=[username]; Password=[password]; Uso del cifrado para Data=Obligatorio

    • En desuso:

      Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; User ID=[username]; Password=[password]; Uso del cifrado para Data=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING
    • Nuevo:

      Server=[server];Database=[database];Authentication=SqlPassword;UID=[username];PWD=[password];Encrypt=Mandatory

    • En desuso:

      Server=[server];Database=[database];UID=[username];PWD=[password];Encrypt=Mandatory

Autenticación integrada de Windows mediante la interfaz del proveedor de compatibilidad para seguridad (SSPI)

  • Usando IDataInitialize::GetDataSource
    • Nuevo:

      Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryIntegrated; Uso del cifrado para Data=Obligatorio

    • En desuso:

      Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Integrated Security=SSPI; Uso del cifrado para Data=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING
    • Nuevo:

      Server=[server];Database=[database];Autenticación=ActiveDirectoryIntegrated;Cifrar=Obligatorio

    • En desuso:

      Server=[server];Database=[database];Trusted_Connection=yes;Encrypt=Obligatorio

Autenticación de nombre de usuario y contraseña de Microsoft Entra

Importante

La opción de autenticación ActiveDirectoryPassword (autenticación con contraseña Microsoft Entra ID) está en desuso en los controladores sql de Microsoft. Este flujo de autenticación de alto riesgo no es compatible con la autenticación multifactor (MFA) obligatoria Microsoft Entra y es posible que no funcione en inquilinos en los que se aplica MFA. Planee la migración a un método de autenticación de Microsoft Entra diferente.

La autenticación mediante contraseña de Microsoft Entra ID se basa en la concesión de credenciales de contraseña del propietario del recurso (ROPC) de OAuth 2.0, que permite a una aplicación iniciar la sesión del usuario mediante la administración directa de su contraseña.

Microsoft recomienda no usar el flujo ROPC porque no es compatible con MFA. En la mayoría de los escenarios, hay alternativas más seguras disponibles y recomendadas. Este flujo requiere un alto grado de confianza en la aplicación y conlleva riesgos que no están presentes en otros flujos. Use este flujo solo cuando los flujos más seguros no sean viables. Microsoft se aleja de este flujo de autenticación de alto riesgo para proteger a los usuarios frente a ataques malintencionados. Para más información, consulte Planeamiento de la autenticación multifactor obligatoria para Azure.

Cuando un usuario está presente al iniciar sesión, use la autenticación ActiveDirectoryInteractive o ActiveDirectoryIntegrated para que el registro de auditoría se atribuya al usuario que ha iniciado sesión y se apliquen las directivas de Acceso condicional.

Para escenarios de servicio a servicio sin supervisión, siga las directrices sobre cuentas de servicio de Microsoft Entra:

  • Si la aplicación se ejecuta en la infraestructura de Azure, use ActiveDirectoryMSI (o ActiveDirectoryManagedIdentity en algunos controladores). Las identidades administradas eliminan la sobrecarga de mantener y rotar secretos y certificados.
  • Si la identidad administrada no está disponible (por ejemplo, la aplicación se ejecuta fuera de Azure), use ActiveDirectoryServicePrincipal. Cuando el controlador lo admita, prefiera un certificado de cliente sobre un secreto de cliente. Con un certificado, la clave privada permanece en el cliente y solo se envía una aserción firmada a Microsoft Entra para autenticar al cliente. Si la clave se almacena en hardware (por ejemplo, en un TPM o un HSM) o está marcada como no exportable, no puede copiarse como una cadena del mismo modo que sí puede hacerse con un secreto de cliente.
  • No use una cuenta de usuario de Microsoft Entra como cuenta de servicio.
  • Usando IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryPassword; User ID=[username]; Password=[password]; Uso del cifrado para Data=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING

    Server=[server];Database=[database];Authentication=ActiveDirectoryPassword;UID=[username];PWD=[password];Encrypt=Mandatory

Autenticación integrada de Microsoft Entra

  • Usando IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryIntegrated; Uso del cifrado para Data=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING

    Server=[server];Database=[database];Autenticación=ActiveDirectoryIntegrated;Cifrar=Obligatorio

Autenticación de Microsoft Entra mediante un token de acceso

  • Usando IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Access Token=[access token];Uso de cifrado para los datos=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING

    no se admite el suministro del token de acceso a través de DBPROP_INIT_PROVIDERSTRING

Autenticación interactiva de Microsoft Entra

  • Usando IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryInteractive; User ID=[username]; Uso del cifrado para Data=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING

    Server=[server];Database=[database];Authentication=ActiveDirectoryInteractive;UID=[username];Encrypt=Mandatory

Autenticación de identidad gestionada por Microsoft Entra

  • Usando IDataInitialize::GetDataSource
    • Identidad administrada asignada por el usuario:

      Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryMSI; User ID=[Object ID]; Uso del cifrado para Data=Obligatorio

    • Identidad administrada asignada por el sistema:

      Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryMSI; Uso del cifrado para Data=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING
    • Identidad administrada asignada por el usuario:

      Server=[server]; Database=[database]; Authentication=ActiveDirectoryMSI; UID=[Id. de objeto]; Encrypt=Obligatorio

    • Identidad administrada asignada por el sistema:

      Server=[server];Database=[database];Authentication=ActiveDirectoryMSI;Encrypt=Mandatory

Autenticación del principal de servicio de Microsoft Entra

  • Usando IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryServicePrincipal; User ID=[Application (client) ID]; Password=[Secreto de aplicación (cliente)]; Uso del cifrado para Data=Obligatorio

  • Usando DBPROP_INIT_PROVIDERSTRING

    Server=[server]; Database=[database]; Authentication=ActiveDirectoryServicePrincipal; UID=[Id. de aplicación (cliente)]; PWD=[Secreto de aplicación (cliente)]; Encrypt=Obligatorio

Ejemplos de código

En los siguientes ejemplos se muestra el código necesario para conectarse a Microsoft Entra ID con palabras clave de conexión.

Token de acceso

#include <string>
#include <iostream>
#include <msdasc.h>

int main()
{
    wchar_t azureServer[] = L"server";
    wchar_t azureDatabase[] = L"mydatabase";
    wchar_t accessToken[] = L"eyJ0eXAiOi...";
    IDBInitialize *pIDBInitialize = nullptr;
    IDataInitialize* pIDataInitialize = nullptr;
    HRESULT hr = S_OK;

    CoInitialize(nullptr);

    // Construct the connection string.
    std::wstring connString = L"Provider=MSOLEDBSQL19;Data Source=" + std::wstring(azureServer) + L";Initial Catalog=" + 
                              std::wstring(azureDatabase) + L";Access Token=" + accessToken + L";Use Encryption for Data=Mandatory;";
    hr = CoCreateInstance(CLSID_MSDAINITIALIZE, nullptr, CLSCTX_INPROC_SERVER, 
                          IID_IDataInitialize, reinterpret_cast<LPVOID*>(&pIDataInitialize));
    if (FAILED(hr))
    {
        std::cout << "Failed to create an IDataInitialize instance." << std::endl;
        goto Cleanup;
    }
    hr = pIDataInitialize->GetDataSource(nullptr, CLSCTX_INPROC_SERVER, connString.c_str(), 
                                         IID_IDBInitialize, reinterpret_cast<IUnknown**>(&pIDBInitialize));
    if (FAILED(hr))
    {
        std::cout << "Failed to get data source object." << std::endl;
        goto Cleanup;
    }
    hr = pIDBInitialize->Initialize();
    if (FAILED(hr))
    {
        std::cout << "Failed to establish connection." << std::endl;
        goto Cleanup;
    }

Cleanup:
    if (pIDBInitialize)
    {
        pIDBInitialize->Uninitialize();
        pIDBInitialize->Release();
    }
    if (pIDataInitialize)
    {
        pIDataInitialize->Release();
    }

    CoUninitialize();
}

Integrado en Active Directory

#include <string>
#include <iostream>
#include <msdasc.h>

int main()
{
    wchar_t azureServer[] = L"server";
    wchar_t azureDatabase[] = L"mydatabase";
    IDBInitialize *pIDBInitialize = nullptr;
    IDataInitialize* pIDataInitialize = nullptr;
    HRESULT hr = S_OK;

    CoInitialize(nullptr);

    // Construct the connection string.
    std::wstring connString = L"Provider=MSOLEDBSQL19;Data Source=" + std::wstring(azureServer) + L";Initial Catalog=" + 
                              std::wstring(azureDatabase) + L";Authentication=ActiveDirectoryIntegrated;Use Encryption for Data=Mandatory;";

    hr = CoCreateInstance(CLSID_MSDAINITIALIZE, nullptr, CLSCTX_INPROC_SERVER, 
                          IID_IDataInitialize, reinterpret_cast<LPVOID*>(&pIDataInitialize));
    if (FAILED(hr)) 
    {
        std::cout << "Failed to create an IDataInitialize instance." << std::endl;
        goto Cleanup;
    }
    hr = pIDataInitialize->GetDataSource(nullptr, CLSCTX_INPROC_SERVER, connString.c_str(), 
                                         IID_IDBInitialize, reinterpret_cast<IUnknown**>(&pIDBInitialize));
    if (FAILED(hr))
    {
        std::cout << "Failed to get data source object." << std::endl;
        goto Cleanup;
    }
    hr = pIDBInitialize->Initialize();
    if (FAILED(hr))
    {
        std::cout << "Failed to establish connection." << std::endl;
        goto Cleanup;
    }

Cleanup:
    if (pIDBInitialize)
    {
        pIDBInitialize->Uninitialize();
        pIDBInitialize->Release();
    }
    if (pIDataInitialize)
    {
        pIDataInitialize->Release();
    }

    CoUninitialize();
}