Usar Microsoft Entra ID

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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 o Azure SQL Managed Instance mediante una identidad federada. Los nuevos métodos de autenticación de Microsoft Entra incluyen:

  • Nombre de usuario y contraseña

  • Access token

  • 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 de entidad de servicio de Microsoft Entra

Nota:

No se admite el uso de DataTypeCompatibility los siguientes modos de autenticación con (o 80 su propiedad correspondiente) establecer en no es compatible

  • 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 de entidad 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 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

  • Con IDataInitialize::GetDataSource
    • Nuevo:

      Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=SqlPassword;User ID=[username];Password=[password];Use Encryption for Data=Mandatory

    • En desuso:

      Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];User ID=[username];Password=[password];Use Encryption for Data=Mandatory

  • Con 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)

  • Con IDataInitialize::GetDataSource
    • Nuevo:

      Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=ActiveDirectoryIntegrated;Use Encryption for Data=Mandatory

    • En desuso:

      Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Integrated Security=SSPI;Use Encryption for Data=Mandatory

  • Con DBPROP_INIT_PROVIDERSTRING
    • Nuevo:

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

    • En desuso:

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

Nombre de usuario y contraseña de Microsoft Entra

  • Con IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=ActiveDirectoryPassword;User ID=[username];Password=[password];Use Encryption for Data=Mandatory

  • Con DBPROP_INIT_PROVIDERSTRING

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

Autenticación integrada de Microsoft Entra

  • Con IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=ActiveDirectoryIntegrated;Use Encryption for Data=Mandatory

  • Con DBPROP_INIT_PROVIDERSTRING

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

Autenticación de Microsoft Entra mediante un token de acceso

  • Con IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Access Token=[access token] ;Use Encryption for Data=Mandatory

  • Con 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

  • Con IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=ActiveDirectoryInteractive;User ID=[username];Use Encryption for Data=Mandatory

  • Con DBPROP_INIT_PROVIDERSTRING

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

Autenticación de identidad administrada de Microsoft Entra

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

      Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=ActiveDirectoryMSI;User ID=[Object ID];Use Encryption for Data=Mandatory

    • Identidad administrada asignada por el sistema:

      Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=ActiveDirectoryMSI;Use Encryption for Data=Mandatory

  • Con DBPROP_INIT_PROVIDERSTRING
    • Identidad administrada asignada por el usuario:

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

    • Identidad administrada asignada por el sistema:

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

Autenticación de entidad de servicio de Microsoft Entra

  • Con IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;Data Source=[server];Initial Catalog=[database];Authentication=ActiveDirectoryServicePrincipal;User ID=[Application (client) ID];Password=[Application (client) secret];Use Encryption for Data=Mandatory

  • Con DBPROP_INIT_PROVIDERSTRING

    Server=[server];Database=[database];Authentication=ActiveDirectoryServicePrincipal;UID=[Application (client) ID];PWD=[Application (client) secret];Encrypt=Mandatory

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

Pasos siguientes