Uwierzytelnianie Microsoft Entra ID za pomocą go-mssqldb

Sterownik go-mssqldb obsługuje uwierzytelnianie Microsoft Entra ID za pośrednictwem pakietu azuread. Ten pakiet rejestruje osobny sterownik o nazwie azuresql, który opakowuje standardowy sterownik sqlserver, dodając obsługę poświadczeń Microsoft Entra ID.

Uwaga

Wszystkie fedauth wbudowane metody uwierzytelniania wymagają nazwy azuresql sterownika (nie sqlserver). Jeśli używasz sql.Open("sqlserver", ...) z parametrem fedauth, uwierzytelnianie kończy się niepowodzeniem bez żadnego komunikatu w przypadku Login failed for user ''. Zaimportuj paczkę azuread i użyj azuresql tak, jak pokazano w poniższym przykładzie.

Wybierz przepływ uwierzytelniania FedAuth

Użyj poniższej tabeli, aby wybrać odpowiedni przepływ dla środowiska hostingowego i źródła poświadczeń:

Jeśli musisz się połączyć z... Zacznij od... Użyj, gdy...
Rozwój lokalny ActiveDirectoryDefault Chcesz ponownie użyć poświadczeń Azure CLI lub Azure Developer CLI bez konfigurowania lokalnie zasady usługi lub zarządzanej tożsamości.
Aplikacja hostowana w Azure z zarządzaną tożsamością ActiveDirectoryManagedIdentity Chcesz przewidywalnej konfiguracji produkcji i nie chcesz mieć innych lokalnych źródeł kwalifikacji w łańcuchu.
A CI/CD pipeline in Azure DevOps ActiveDirectoryAzurePipelines Twój pipeline już korzysta z połączenia z usługą Azure i udostępnia SYSTEM_ACCESSTOKEN.
Kubernetes z Azure Workload Identity ActiveDirectoryWorkloadIdentity Twój pod otrzymuje plik token OIDC i chcesz tożsamość obciążenia zamiast tajemnicy klienta.
Główny pracownik służby z certyfikatem lub tajemnicą ActiveDirectoryServicePrincipal Twoja aplikacja uwierzytelnia się jako rejestracja aplikacji i zarządzasz sekretem klienta lub certyfikatem.
Narzędzie, które już ma token dostępu ActiveDirectoryServicePrincipalAccessToken lub własny dostawca tokenów Twoja aplikacja pobiera i odświeża tokeny spoza sterownika.
Token użytkownika delegowany z upstream web API ActiveDirectoryOnBehalfOf Musisz wymienić token użytkownika na token o zakresie SQL w usłudze warstwy pośredniej.
Narzędzie deweloperskie lub narzędzie interaktywne ActiveDirectoryInteractive, ActiveDirectoryDeviceCode, ActiveDirectoryAzClilub ActiveDirectoryAzureDeveloperCli Na miejscu jest użytkownik, aby się zalogować, lub chcesz użyć ponownie istniejącej lokalnej sesji CLI.
Aplikacja dostępna wyłącznie na Windows, która obsługuje zintegrowane wymagania uwierzytelniania ActiveDirectoryIntegrated (zaawansowane) Dostarczasz niestandardową logikę pozyskiwania tokenów dla scenariuszy zintegrowanych.

Jeśli używasz tych samych parametrów połączenia lokalnie i w hostingu na platformie Azure, ActiveDirectoryDefault to dobry punkt wyjścia. W środowisku produkcyjnym użyj ActiveDirectoryManagedIdentity lub ActiveDirectoryServicePrincipal, aby uniknąć opóźnienia związanego z łańcuchem poświadczeń.

Zainstaluj pakiet Azure.

Pobierz podpakiet azuread, który rejestruje sterownik azuresql:

go get github.com/microsoft/go-mssqldb/azuread

Użyj sterownika AzureSQL

Zaimportuj pakiet azuread (zamiast bazowego pakietu go-mssqldb lub jako dodatek do niego) i nawiązuj połączenia, używając nazwy sterownika azuresql:

import (
    "database/sql"

    _ "github.com/microsoft/go-mssqldb/azuread"
)

func main() {
    db, err := sql.Open("azuresql",
        "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false")
    // ...
}

Wszystkie poniższe przykłady dotyczą Azure SQL. Zachowaj encrypt=true&TrustServerCertificate=false w ciągu połączenia, aby sterownik weryfikował certyfikat serwera.

Typy uprawnień Fedauth

Ustaw fedauth parametr połączenia na jedną z następujących wartości. Większość typów mapuje się na dane uwierzytelniające Azure Identity z pakietuazidentity. ActiveDirectoryServicePrincipalAccessToken a niestandardowe API dostawców tokenów korzystają z tokenów dostarczanych przez dzwoniących.

ActiveDirectoryDefault

Używa azidentity.DefaultAzureCredential, który kolejno sprawdza następujące źródła uwierzytelniania:

  1. Zmienne środowiskowe (AZURE_TENANT_ID, AZURE_CLIENT_ID, i tak dalej).
  2. Tożsamość obciążenia roboczego dla platformy Kubernetes.
  3. Tożsamość zarządzana.
  4. Poświadczenia Azure CLI.
  5. Poświadczenia Azure Developer CLI
sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false

Używaj tego typu na potrzeby programowania lokalnego, ponieważ automatycznie używa poświadczeń Azure CLI. W środowisku produkcyjnym używaj bezpośrednio ActiveDirectoryManagedIdentity lub ActiveDirectoryServicePrincipal. DefaultAzureCredential przechodzi przez każde źródło poświadczeń przy pierwszym połączeniu, co powoduje dodatkowe opóźnienie, które jest zbędne dla obciążeń produkcyjnych.

ActiveDirectoryManagedIdentity

Uwierzytelnia się za pomocą zarządzanej tożsamości przypisanej przez system lub przez użytkownika. Dla tożsamości przypisanej przez użytkownika podaj identyfikator klienta w parametrze:user id

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryManagedIdentity&encrypt=true&TrustServerCertificate=false

Z tożsamością przypisaną przez użytkownika:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryManagedIdentity&user id=<client-id>&encrypt=true&TrustServerCertificate=false

Note

ActiveDirectoryMSI to alias dla elementu ActiveDirectoryManagedIdentity.

ActiveDirectoryServicePrincipal

Uwierzytelnia się jako podmiot usługi (rejestracja aplikacji) za pomocą identyfikatora klienta i tajemnicy klienta:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryServicePrincipal&user id=<client-id>&password=<client-secret>&encrypt=true&TrustServerCertificate=false

Do uwierzytelniania nazwy głównej usługi opartego na certyfikacie użyj clientcertpath=<path-to-certificate> wraz z password=<certificate-password>.

Note

ActiveDirectoryApplication to alias dla elementu ActiveDirectoryServicePrincipal.

ActiveDirectoryServicePrincipalAccessToken

Używa uprzednio uzyskanego tokenu dostępu jednostki usługi, który aplikacja przekazuje bezpośrednio w parametrach połączenia:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryServicePrincipalAccessToken&password=<access-token>&encrypt=true&TrustServerCertificate=false

Używaj tego przepływu tylko wtedy, gdy twoja aplikacja już uzyskuje i odświeża token dostępu poza sterownikiem. W większości scenariuszy komunikacji między usługami należy preferować ActiveDirectoryServicePrincipal lub niestandardowego dostawcę tokenów.

ActiveDirectoryPassword

Ważna

Opcja uwierzytelniania ActiveDirectoryPassword (uwierzytelnianie hasłem Microsoft Entra ID) została wycofana w sterownikach Microsoft SQL. Ten proces uwierzytelniania wysokiego ryzyka jest niezgodny z obowiązkowym uwierzytelnianiem wieloskładnikowym (MFA) w usłudze Microsoft Entra i może nie działać w dzierżawcach, w których wymuszane jest MFA. Zaplanuj migrację do innej metody uwierzytelniania Microsoft Entra.

Microsoft Entra ID uwierzytelnianie hasłem jest oparte na przyznaniu poświadczeń hasła właściciela zasobu OAuth 2.0 (ROPC), co umożliwia aplikacji logowanie użytkownika bezpośrednio przy użyciu obsługi hasła.

Microsoft zaleca, aby nie używać przepływu ROPC, ponieważ jest on niezgodny z uwierzytelnianiem wieloskładnikowym. W większości scenariuszy dostępne są bezpieczniejsze alternatywy i zalecane. Ten przepływ wymaga wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie są obecne w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bezpieczniejsze przepływy nie są opłacalne. Firma Microsoft odchodzi od tego przepływu uwierzytelniania wysokiego ryzyka, aby chronić użytkowników przed złośliwymi atakami. Aby uzyskać więcej informacji, zobacz Planowanie obowiązkowego uwierzytelniania wieloskładnikowego dla platformy Azure.

Gdy użytkownik jest obecny podczas logowania, użyj uwierzytelniania ActiveDirectoryInteractive lub ActiveDirectoryIntegrated, aby zastosować atrybuty dziennika inspekcji do zalogowanego użytkownika i zasad dostępu warunkowego.

W przypadku nienadzorowanych scenariuszy komunikacji między usługami postępuj zgodnie z wskazówkami dotyczącymi kont usług Microsoft Entra:

  • Jeśli aplikacja działa w infrastrukturze Azure, użyj activedirectoryMSI (lub ActiveDirectoryManagedIdentity w niektórych sterownikach). Tożsamości zarządzane eliminują obciążenie związane z utrzymywaniem i rotacją kluczy tajnych oraz certyfikatów.
  • Jeśli tożsamość zarządzana nie jest dostępna (na przykład aplikacja działa poza platformą Azure), użyj ActiveDirectoryServicePrincipal. Jeśli sterownik to obsługuje, preferowane jest użycie certyfikatu klienta zamiast wpisu tajnego klienta. W przypadku certyfikatu klucz prywatny pozostaje na kliencie, a do Microsoft Entra jest wysyłane tylko podpisane potwierdzenie w celu uwierzytelnienia klienta. Jeśli klucz jest przechowywany w sprzęcie (na przykład w module TPM lub HSM) albo oznaczony jako nieeksportowalny, nie można go wyeksportować w postaci ciągu znaków tak, jak można to zrobić z kluczem tajnym klienta.
  • Nie używaj konta użytkownika Microsoft Entra jako konta usługi.

Uwierzytelnia się za pomocą nazwy użytkownika i hasła Microsoft Entra:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryPassword&user id=<user>@mydomain.com&password=<password>&applicationclientid=<app-id>&encrypt=true&TrustServerCertificate=false

Parametr applicationclientid jest wymagany dla tego przepływu.

ActiveDirectoryInteractive

Otwiera interaktywny komunikat logowania użytkownika w przeglądarce. Odpowiednie do lokalnych narzędzi programistycznych:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryInteractive&user id=<user>@mydomain.com&applicationclientid=<app-id>&encrypt=true&TrustServerCertificate=false

Parametr applicationclientid jest wymagany dla tego przepływu.

ActiveDirectoryDeviceCode

Wyświetla kod urządzenia, który użytkownik ma wpisać w .https://microsoft.com/devicelogin Przydatne w środowiskach bez przeglądarki:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDeviceCode&encrypt=true&TrustServerCertificate=false

ActiveDirectoryAzCli

Używa tokena z zalogowanej sesji Azure CLI:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryAzCli&encrypt=true&TrustServerCertificate=false

ActiveDirectoryAzureDeveloperCli

Używa tokena z zalogowanej sesji Azure Developer CLI (azd) :

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryAzureDeveloperCli&encrypt=true&TrustServerCertificate=false

ActiveDirectoryEnvironment

Odczytuje poświadczenia z zmiennych środowiskowych. Biblioteka Azure Identity inspektuje zmienne takie jak AZURE_TENANT_ID, AZURE_CLIENT_ID, oraz AZURE_CLIENT_SECRET:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryEnvironment&encrypt=true&TrustServerCertificate=false

ActiveDirectoryWorkloadIdentity

Uwierzytelnia się za pomocą federacji tożsamości obciążeń. Stosuj tę metodę w podach Kubernetes z konfiguracją Azure Workload Identity.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryWorkloadIdentity&encrypt=true&TrustServerCertificate=false

ActiveDirectoryAzurePipelines

Uwierzytelnia się za pomocą połączenia usługi Azure Pipelines. Dostarcz parametry pipeline w parametry połączenia lub pozwól sterownikowi odczytać brakujące wartości ze zmiennych środowiskowych Azure Pipelines.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryAzurePipelines&user id=<client-id>@<tenant-id>&serviceconnectionid=<service-connection-id>&systemtoken=<system-access-token>&encrypt=true&TrustServerCertificate=false

Ustaw parametry zgodnie z wymaganiami sterownika:

Parameter Description
user id Identyfikator klienta jednostki usługi, opcjonalnie po którym następuje @tenant-id.
serviceconnectionid Identyfikator połączenia usługi z Azure DevOps.
systemtoken Token dostępu systemu potoków ($(System.AccessToken)).

ActiveDirectoryClientAssertion

Uwierzytelnia się za pomocą asercji klienta (podpisanego tokena JWT) zamiast sekretu klienta. Podaj podpisany JWT w parametrze clientassertion:

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryClientAssertion&user id=<client-id>@<tenant-id>&clientassertion=<jwt-token>&encrypt=true&TrustServerCertificate=false

ActiveDirectoryOnBehalfOf

Uwierzytelnia się za pomocą przepływu On-Behalf-Of (OBO). Sterownik wymienia token użytkownika z systemu nadrzędnego na nowy token przeznaczony dla programu SQL Server.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryOnBehalfOf&user id=<client-id>@<tenant-id>&password=<client-secret>&userassertion=<user-token>&encrypt=true&TrustServerCertificate=false

Etap uwierzytelniania klienta może używać password, clientcertpath, lub clientassertion, ale userassertion jest to zawsze wymagane.

ActiveDirectoryIntegrated

Obsługuje zaawansowany workflow z zintegrowanym uwierzytelnianiem. Ten tryb wymaga niestandardowej logiki pozyskiwania tokenów przez dostawcę tokenów.

Używaj tego trybu tylko na Windows. Na Linuksie i macOS używaj niestandardowego dostawcy tokenów do procesu uwierzytelniania.

sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryIntegrated&encrypt=true&TrustServerCertificate=false

Dostawca niestandardowych tokenów

Jeśli żaden z wbudowanych fedauth typów nie pasuje do twojego scenariusza, użyj jednego z tych API dostawców tokenów, aby dostarczyć własną logikę pozyskiwania tokenów:

Użyj tego API, gdy masz wstępnie pozyskany token dostępu OAuth2:

import (
    "context"
    "database/sql"
    "log"

    "github.com/microsoft/go-mssqldb"
)

connector, err := mssql.NewSecurityTokenConnector(
    "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=false",
    func(ctx context.Context) (string, error) {
        // Return a pre-acquired OAuth2 access token.
        return myTokenProvider(ctx)
    },
)
if err != nil {
    log.Fatal(err)
}
db := sql.OpenDB(connector)

NewAccessTokenConnector (Uproszczone API)

Użyj tego API do prostszego pozyskiwania tokenów bez obsługi kontekstu.

import (
    "database/sql"
    "log"

    "github.com/microsoft/go-mssqldb"
)

connector, err := mssql.NewAccessTokenConnector(
    "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=false",
    func() (string, error) {
        // Return a pre-acquired OAuth2 access token.
        return mySimpleTokenProvider()
    },
)
if err != nil {
    log.Fatal(err)
}
db := sql.OpenDB(connector)

NewActiveDirectoryTokenConnector (niestandardowe przepływy pracy ADAL)

Korzystaj z tego API do niestandardowych procesów pozyskiwania tokenów Azure AD, gdy ani fedauth wbudowane tryby, ani API SecurityToken nie pasują do Twojej sytuacji:

import (
    "context"
    "database/sql"
    "log"

    "github.com/microsoft/go-mssqldb"
)

connector, err := mssql.NewActiveDirectoryTokenConnector(
    "sqlserver://<server>.database.windows.net?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=false",
    mssql.FedAuthADALWorkflowPassword,
    func(ctx context.Context, serverSPN, stsURL string) (string, error) {
        // Custom ADAL workflow using server-provided SPN and STS URL.
        return myCustomADALFlow(ctx, serverSPN, stsURL)
    },
)
if err != nil {
    log.Fatal(err)
}
db := sql.OpenDB(connector)

Takie podejście jest przydatne, gdy musisz zintegrować się z niestandardowym dostawcą tożsamości, wdrożyć buforowanie tokenów lub obsłużyć typ poświadczenia nieobjęty pakietem azuread . Większość aplikacji powinna korzystać z NewSecurityTokenConnector z wcześniej uzyskanym tokenem.

Typowe opcje uprawnień

Te parametry mają zastosowanie dla wielu typów fedauth:

Parameter Description
applicationclientid ID aplikacji klienta. Wymagane dla ActiveDirectoryPassword i ActiveDirectoryInteractive.
clientcertpath Ścieżka do pliku certyfikatu klienta PEM lub PFX dla uwierzytelniania usługi opartego na certyfikatach lub uwierzytelniania On-Behalf-Of.
clientassertion Podpisana asercja JWT do uwierzytelniania ActiveDirectoryClientAssertion lub On-Behalf-Of.
serviceconnectionid Identyfikator połączenia usługi Azure Pipelines.
systemtoken token dostępu systemu Azure Pipelines
userassertion Token użytkownika nadrzędnego dla ActiveDirectoryOnBehalfOf.
tokenfilepath Ścieżka do pliku tokenu OIDC dla ActiveDirectoryWorkloadIdentity w Kubernetes.
additionallyallowedtenants Lista dodatkowych identyfikatorów dzierżawców oddzielonych przecinkami, aby umożliwić potrzebne uwierzytelnienie wielodzierżawcze.
disableinstancediscovery Ustaw wartość true, aby wyłączyć wykrywanie instancji; używaj tej opcji tylko wtedy, gdy kontrolujesz adres URL autorytetu.
sendcertificatechain Ustaw na true wysyłanie łańcucha certyfikatów do uwierzytelniania opartego na certyfikatach.