Menggunakan ID Microsoft Entra

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Titik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase SQL di Microsoft Fabric

Unduh driver OLE DB

Tujuan

Dimulai dengan versi 18.2.1, Driver Microsoft OLE DB untuk SQL Server memungkinkan aplikasi OLE DB tersambung ke Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, dan Microsoft Fabric menggunakan identitas federasi .

Metode autentikasi Microsoft Entra meliputi:

  • Nama pengguna dan kata sandi
  • Token akses
  • Autentikasi terintegrasi

Versi 18.3.0 menambahkan dukungan untuk metode autentikasi Microsoft Entra berikut:

Versi 18.5.0 menambahkan dukungan untuk metode autentikasi berikut:

  • Autentikasi prinsipal layanan Microsoft Entra

Catatan

Penggunaan mode autentikasi berikut dengan DataTypeCompatibility (atau properti yang sesuai) diatur ke 80tidak didukung:

  • Autentikasi Microsoft Entra menggunakan nama pengguna dan kata sandi
  • Autentikasi Microsoft Entra menggunakan token akses
  • Autentikasi terintegrasi Microsoft Entra
  • Autentikasi interaktif Microsoft Entra
  • Autentikasi identitas terkelola di Microsoft Entra
  • Autentikasi prinsipal layanan Microsoft Entra

Untuk menggunakan autentikasi Microsoft Entra, Anda harus mengonfigurasi sumber data Azure SQL Anda. Untuk informasi selengkapnya, lihat Mengonfigurasi dan mengelola autentikasi Microsoft Entra dengan Azure SQL.

Kata kunci dan properti string koneksi

Kata kunci string koneksi berikut telah diperkenalkan untuk mendukung autentikasi Microsoft Entra:

String koneksi kata kunci Properti koneksi Deskripsi
access_token SSPROP_AUTH_ACCESS_TOKEN Menentukan token akses untuk mengautentikasi ke ID Microsoft Entra.
Autentikasi SSPROP_AUTH_MODE Menentukan metode autentikasi yang akan digunakan.

Untuk informasi selengkapnya tentang kata kunci/properti baru, lihat halaman berikut ini:

Validasi enkripsi dan sertifikat

Lihat Enkripsi dan validasi sertifikat untuk informasi selengkapnya.

Penambahan GUI

Antarmuka pengguna grafis driver telah ditingkatkan untuk memungkinkan autentikasi Microsoft Entra. Untuk informasi selengkapnya, lihat:

Contoh string koneksi

Bagian ini memperlihatkan contoh kata kunci string koneksi baru dan yang sudah ada untuk digunakan dengan properti IDataInitialize::GetDataSource dan DBPROP_INIT_PROVIDERSTRING.

Autentikasi SQL

  • Menggunakan IDataInitialize::GetDataSource:
    • Baru:

      Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=SqlPassword; ID Pengguna=[nama pengguna]; Kata sandi=[kata sandi]; Gunakan Enkripsi untuk Data=Wajib

    • Dihapus

      Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database]; ID Pengguna=[nama pengguna]; Kata sandi=[kata sandi]; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:
    • Baru:

      Server=[server]; Database=[database];Authentication=SqlPassword; UID=[nama pengguna]; PWD=[kata sandi]; Enkripsi=Wajib

    • Dihapus

      Server=[server]; Database=[database]; UID=[nama pengguna]; PWD=[kata sandi]; Enkripsi=Wajib

Autentikasi Windows terintegrasi menggunakan Antarmuka Penyedia Dukungan Keamanan (SSPI)

  • Menggunakan IDataInitialize::GetDataSource:
    • Baru:

      Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=ActiveDirectoryIntegrated; Gunakan Enkripsi untuk Data=Wajib

    • Dihapus

      Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Integrated Security=SSPI; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:
    • Baru:

      Server=[server]; Database=[database];Authentication=ActiveDirectoryIntegrated; Enkripsi=Wajib

    • Dihapus

      Server=[server]; Database=[database];Trusted_Connection=ya; Enkripsi=Wajib

Autentikasi nama pengguna dan kata sandi Microsoft Entra

Important

Opsi autentikasi ActiveDirectoryPassword (autentikasi kata sandi Microsoft Entra ID) tidak digunakan lagi di driver SQL Microsoft. Alur autentikasi berisiko tinggi ini tidak kompatibel dengan autentikasi multifaktor (MFA) Microsoft Entra wajib dan mungkin tidak berfungsi di penyewa tempat MFA diberlakukan. Rencanakan untuk bermigrasi ke metode autentikasi Microsoft Entra yang berbeda.

Autentikasi kata sandi Microsoft Entra ID didasarkan pada grant OAuth 2.0 Resource Owner Password Credentials (ROPC), yang memungkinkan aplikasi mengautentikasi pengguna dengan menangani kata sandi mereka secara langsung.

Microsoft menyarankan agar Anda tidak menggunakan alur ROPC karena tidak kompatibel dengan MFA. Dalam kebanyakan skenario, alternatif yang lebih aman tersedia dan direkomendasikan. Alur ini membutuhkan tingkat kepercayaan yang tinggi pada aplikasi, dan membawa risiko yang tidak ada dalam alur lain. Gunakan alur ini hanya jika opsi yang lebih aman tidak memungkinkan. Microsoft menjauh dari alur autentikasi berisiko tinggi ini untuk melindungi pengguna dari serangan berbahaya. Untuk informasi selengkapnya, lihat Merencanakan autentikasi multifaktor wajib untuk Azure.

Saat pengguna hadir saat proses masuk, gunakan autentikasi ActiveDirectoryInteractive atau ActiveDirectoryIntegrated sehingga jejak audit dikaitkan dengan pengguna yang masuk dan kebijakan Akses Bersyarat diterapkan.

Untuk skenario layanan ke layanan tanpa pengawas, ikuti panduan akun layanan Microsoft Entra:

  • Jika aplikasi Anda berjalan pada infrastruktur Azure, gunakan ActiveDirectoryMSI (atau ActiveDirectoryManagedIdentity di beberapa driver). Identitas terkelola menghilangkan overhead untuk memelihara dan memutar rahasia dan sertifikat.
  • Jika identitas terkelola tidak tersedia (misalnya, aplikasi berjalan di luar Azure), gunakan ActiveDirectoryServicePrincipal. Di mana driver mendukungnya, lebih memilih sertifikat klien daripada rahasia klien. Dengan sertifikat, kunci privat tetap berada di klien dan hanya pernyataan yang ditandatangani yang dikirim ke Microsoft Entra untuk mengautentikasi klien. Jika kunci disimpan di perangkat keras (seperti TPM atau HSM) atau ditandai sebagai tidak dapat diekspor, kunci tersebut tidak dapat disalin keluar sebagai string sebagaimana rahasia klien dapat disalin.
  • Jangan gunakan akun pengguna Microsoft Entra sebagai akun layanan.
  • Menggunakan IDataInitialize::GetDataSource:

    Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=ActiveDirectoryPassword; ID Pengguna=[nama pengguna]; Kata sandi=[kata sandi]; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:

    Server=[server]; Database=[database];Authentication=ActiveDirectoryPassword; UID=[nama pengguna]; PWD=[kata sandi]; Enkripsi=Wajib

Autentikasi terintegrasi Microsoft Entra

  • Menggunakan IDataInitialize::GetDataSource:

    Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=ActiveDirectoryIntegrated; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:

    Server=[server]; Database=[database];Authentication=ActiveDirectoryIntegrated; Enkripsi=Wajib

Autentikasi Microsoft Entra menggunakan token akses

  • Menggunakan IDataInitialize::GetDataSource:

    Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Token Akses=[token akses]; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:

    Menyediakan token akses melalui DBPROP_INIT_PROVIDERSTRING tidak didukung

Autentikasi interaktif Microsoft Entra

  • Menggunakan IDataInitialize::GetDataSource:

    Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=ActiveDirectoryInteractive; ID Pengguna=[nama pengguna]; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:

    Server=[server]; Database=[database];Authentication=ActiveDirectoryInteractive; UID=[nama pengguna]; Enkripsi=Wajib

Autentikasi identitas terkelola Microsoft Entra

  • Menggunakan IDataInitialize::GetDataSource:
    • Identitas terkelola yang ditetapkan pengguna:

      Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=ActiveDirectoryMSI; ID Pengguna=[ID Objek]; Gunakan Enkripsi untuk Data=Wajib

    • Identitas terkelola yang ditetapkan sistem:

      Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=ActiveDirectoryMSI; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:
    • Identitas terkelola yang ditetapkan pengguna:

      Server=[server]; Database=[database];Authentication=ActiveDirectoryMSI; UID=[ID Objek]; Enkripsi=Wajib

    • Identitas terkelola yang ditetapkan sistem:

      Server=[server]; Database=[database];Authentication=ActiveDirectoryMSI; Enkripsi=Wajib

Autentikasi prinsipal layanan Microsoft Entra

  • Menggunakan IDataInitialize::GetDataSource:

    Provider=MSOLEDBSQL19; Sumber Data=[server]; Katalog Awal=[database];Authentication=ActiveDirectoryServicePrincipal; ID Pengguna=[ID Aplikasi (klien)]; Password=[Rahasia aplikasi (klien)]; Gunakan Enkripsi untuk Data=Wajib

  • Menggunakan DBPROP_INIT_PROVIDERSTRING:

    Server=[server]; Database=[database];Authentication=ActiveDirectoryServicePrincipal; UID=[ID Aplikasi (klien) ]; PWD=[Rahasia aplikasi (klien)]; Enkripsi=Wajib

Sampel kode

Sampel berikut menunjukkan kode yang diperlukan untuk menyambungkan ke ID Microsoft Entra dengan kata kunci koneksi.

access_token

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

Direktori Aktif yang Terintegrasi

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