Compartir a través de


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

Fin

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

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

  • 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

Nota:

La opción de autenticación ActiveDirectoryPassword (autenticación con contraseña de id. de Microsoft Entra) está en desuso.

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

Microsoft recomienda no usar el flujo ROPC; no es compatible con la autenticación multifactor (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. Solo debe usar este flujo 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 el contexto de usuario esté disponible, use la autenticación ActiveDirectoryInteractive.

Cuando el contexto de usuario no está disponible y la aplicación se ejecuta en la infraestructura de Azure, use ActiveDirectoryMSI (o ActiveDirectoryManagedIdentity en algunos controladores). La identidad administrada elimina la sobrecarga de mantener y rotar secretos y certificados. Si no puede usar Identidad Administrada, use la autenticación de Active Directory Service Principal.

Advertencia

No use la autenticación de principal de servicio cuando haya un contexto de usuario disponible. El acceso exclusivo a la aplicación es de alto privilegio, a menudo concediendo acceso a todo el arrendatario y, posiblemente, permitiendo que un actor malintencionado acceda a los datos de cualquier usuario.

  • Con IDataInitialize::GetDataSource

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

  • 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; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryIntegrated; Uso del cifrado para Data=Obligatorio

  • 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; Origen de datos=[servidor]; Initial Catalog=[database]; Authentication=ActiveDirectoryInteractive; User ID=[username]; Uso del cifrado para Data=Obligatorio

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

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

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

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