使用 Microsoft Entra ID

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲Microsoft Fabric 中的 SQL 資料庫

下載 OLE DB 驅動程式

目的

18.2.1 版開始,Microsoft OLE DB Driver for SQL Server 可讓 OLE DB 應用程式使用同盟身分識別,連線到 Azure SQL 資料庫、Azure SQL 受控執行個體、Azure Synapse Analytics 與 Microsoft Fabric。

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 驗證:

連接字串關鍵字 Connection 屬性 描述
存取權杖 SSPROP_AUTH_ACCESS_TOKEN 指定要向 Microsoft Entra ID 進行驗證的存取權杖。
驗證 SSPROP_AUTH_MODE 指定要使用的驗證方法。

如需有關新關鍵字/屬性的詳細資訊,請參閱下列頁面:

加密和憑證驗證

如需詳細資訊,請參閱加密和憑證驗證

GUI 新增項目

驅動程式圖形化使用者介面已經過增強,可允許 Microsoft Entra 驗證。 如需詳細資訊,請參閱

範例連接字串

本節顯示新連接字串關鍵字和現有連接字串關鍵字的範例,以搭配 IDataInitialize::GetDataSourceDBPROP_INIT_PROVIDERSTRING 屬性使用。

SQL 驗證

  • 使用: IDataInitialize::GetDataSource
    • 新:

      Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];Authentication=SqlPassword;使用者 ID =[username];密碼=[password];使用加密資料=強制

    • 取代:

      Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];使用者 ID =[username];密碼=[password];使用加密資料=強制

  • 使用: 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;資料來源=[伺服器];初始目錄=[資料庫];Authentication=ActiveDirectoryIntegrated;使用加密資料=強制

    • 取代:

      Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];整合安全=SSPI;使用加密資料=強制

  • 使用: DBPROP_INIT_PROVIDERSTRING
    • 新:

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

    • 取代:

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

Microsoft Entra 使用者名稱和密碼驗證。

注意

ActiveDirectoryPassword 驗證選項(Microsoft Entra ID 密碼驗證)已被棄用。

Microsoft Entra ID 密碼基於 OAuth 2.0 資源擁有者密碼憑證(ROPC)授權,允許應用程式直接操作使用者的密碼來登入。

Microsoft 建議你不要使用 ROPC 流程;它與多重驗證(MFA)不相容。 在大部分情況下,有更安全的替代方案可供使用,並建議使用。 這種流程需要對應用程式高度信任,且存在其他流程中不存在的風險。 只有當更安全的流程不可行時,才應該使用這個流程。 Microsoft 正逐步放棄這種高風險的認證流程,以保護使用者免受惡意攻擊。 欲了解更多資訊,請參閱 Azure 強制多重驗證的規劃

當有使用者上下文時,請使用 ActiveDirectoryInteractive 認證。

當使用者上下文無法取得且你的應用程式運行在 Azure 基礎架構上時,請使用 ActiveDirectoryMSI(或某些驅動程式中的 ActiveDirectoryManagedIdentity)。 管理式身份消除了維護與輪換秘密與憑證的負擔。 如果你無法使用管理身份,請使用 ActiveDirectoryServicePrincipal 認證。

警告

當有使用者上下文可用時,不要使用服務主體認證。 僅應用程式的存取本質上屬於高權限,通常會授權整個租戶的存取權限,並可能讓惡意行為者存取任何使用者的客戶資料。

  • 使用: IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];Authentication=ActiveDirectoryPassword;使用者 ID =[username];密碼=[password];使用加密資料=強制

  • 使用: DBPROP_INIT_PROVIDERSTRING

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

Microsoft Entra 整合式驗證

  • 使用: IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];Authentication=ActiveDirectoryIntegrated;使用加密資料=強制

  • 使用: DBPROP_INIT_PROVIDERSTRING

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

使用存取權杖進行 Microsoft Entra 驗證

  • 使用: IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];存取令牌=[存取令牌];使用加密資料=強制

  • 使用: DBPROP_INIT_PROVIDERSTRING

    不支援透過 DBPROP_INIT_PROVIDERSTRING 提供存取權杖

Microsoft Entra 互動式驗證

  • 使用: IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];Authentication=ActiveDirectoryInteractive;使用者 ID =[username];使用加密資料=強制

  • 使用: DBPROP_INIT_PROVIDERSTRING

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

Microsoft Entra 受控識別驗證。

  • 使用: IDataInitialize::GetDataSource
    • 使用者指派的受控識別:

      Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];Authentication=ActiveDirectoryMSI;使用者 ID =[物件 ID];使用加密資料=強制

    • 系統指派的受控識別:

      Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];Authentication=ActiveDirectoryMSI;使用加密資料=強制

  • 使用: DBPROP_INIT_PROVIDERSTRING
    • 使用者指派的受控識別:

      Server=[server];Database=[database];Authentication=ActiveDirectoryMSI;UID=[物件 ID];加密=強制

    • 系統指派的受控識別:

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

Microsoft Entra 服務主體驗證

  • 使用: IDataInitialize::GetDataSource

    Provider=MSOLEDBSQL19;資料來源=[伺服器];初始目錄=[資料庫];Authentication=ActiveDirectoryServicePrincipal;使用者 ID =[應用程式(用戶端)ID];密碼=[應用程式(用戶端)秘密];使用加密資料=強制

  • 使用: DBPROP_INIT_PROVIDERSTRING

    Server=[server];Database=[database];Authentication=ActiveDirectoryServicePrincipal;UID=[應用程式(客戶端)ID];PWD=[應用程式(客戶端)秘密];加密=強制

程式碼範例

下列範例顯示使用連接關鍵字連線到 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();
}