使用 Microsoft Entra ID

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

下载 OLE DB 驱动程序

目的

从版本 18.2.1 开始,Microsoft OLE DB Driver for SQL Server 允许 OLE DB 应用程序使用联合身份连接到 Azure SQL 数据库或 Azure SQL 托管实例实例。 全新 Microsoft Entra 身份验证方法包括:

  • 用户名和密码

  • 访问令牌

  • 集成身份验证

版本 18.3.0 添加了对以下 Microsoft Entra 身份验证方法的支持:

版本 18.5.0 添加了对以下身份验证方法的支持:

  • Microsoft Entra 服务主体身份验证

注意

支持使用以下将 DataTypeCompatibility(或其对应的属性)设置为 80 的身份验证模式:

  • 使用用户名和密码进行 Microsoft Entra 身份验证。
  • 使用访问令牌进行 Microsoft Entra 身份验证
  • Microsoft Entra 集成身份验证
  • Microsoft Entra 交互式身份验证
  • Microsoft Entra 托管标识身份验证
  • Microsoft Entra 服务主体身份验证

要使用 Microsoft Entra 身份验证,必须配置 Azure SQL 数据源。 有关详细信息,请参阅使用 Azure SQL 配置和管理 Microsoft Entra 身份验证

连接字符串关键字和属性

引入了以下连接字符串关键字,以支持 Microsoft Entra 身份验证:

连接字符串关键字 连接属性 说明
访问令牌 SSPROP_AUTH_ACCESS_TOKEN 指定对 Microsoft Entra ID 进行身份验证要使用的访问令牌。
身份验证 SSPROP_AUTH_MODE 指定要使用的身份验证方法。

有关新关键字/属性的详细信息,请参阅以下页面:

加密和证书验证

有关详细信息,请参阅加密和证书验证

GUI 添加件

驱动程序图形用户界面已增强,以允许 Microsoft Entra 身份验证。 有关详细信息,请参阅:

连接字符串示例

本节展示将与 IDataInitialize::GetDataSourceDBPROP_INIT_PROVIDERSTRING 属性一起使用的新连接字符串关键字和现有连接字符串关键字的示例。

SQL 身份验证

  • 使用:IDataInitialize::GetDataSource
    • 新体验:

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

    • 已弃用:

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

  • 使用:DBPROP_INIT_PROVIDERSTRING
    • 新体验:

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

    • 已弃用:

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

使用安全支持提供程序接口 (SSPI) 进行集成 Windows 身份验证

  • 使用:IDataInitialize::GetDataSource
    • 新体验:

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

    • 已弃用:

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

  • 使用:DBPROP_INIT_PROVIDERSTRING
    • 新体验:

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

    • 已弃用:

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

Microsoft Entra 用户名和密码身份验证

  • 使用:IDataInitialize::GetDataSource

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

  • 使用:DBPROP_INIT_PROVIDERSTRING

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

Microsoft Entra 集成身份验证

  • 使用:IDataInitialize::GetDataSource

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

  • 使用:DBPROP_INIT_PROVIDERSTRING

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

使用访问令牌进行 Microsoft Entra 身份验证

  • 使用:IDataInitialize::GetDataSource

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

  • 使用:DBPROP_INIT_PROVIDERSTRING

    不支持通过 DBPROP_INIT_PROVIDERSTRING 提供访问令牌

Microsoft Entra 交互式身份验证

  • 使用:IDataInitialize::GetDataSource

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

  • 使用:DBPROP_INIT_PROVIDERSTRING

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

Microsoft Entra 托管标识身份验证

  • 使用:IDataInitialize::GetDataSource
    • 用户分配的托管标识:

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

    • 系统分配的托管标识:

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

  • 使用:DBPROP_INIT_PROVIDERSTRING
    • 用户分配的托管标识:

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

    • 系统分配的托管标识:

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

Microsoft Entra 服务主体身份验证

  • 使用: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

  • 使用:DBPROP_INIT_PROVIDERSTRING

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

代码示例

以下示例显示了使用连接关键字连接到 Microsoft Entra ID 所需的代码。

访问令牌

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

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

后续步骤