Microsoft Entra ID-autentisering med go-mssqldb

Drivrutinen go-mssqldb stöder Microsoft Entra ID-autentisering via paketetazuread. Detta paket registrerar en separat drivrutin med namnet azuresql, som omsluter standarddrivrutinen sqlserver med stöd för autentiseringsuppgifter för Microsoft Entra ID.

Försiktighet

Alla inbyggda autentiseringsmetoder fedauth kräver drivrutinsnamnet azuresql (inte sqlserver). Om du använder sql.Open("sqlserver", ...) med en fedauth-parameter misslyckas autentiseringen tyst med Login failed for user ''. Importera paketet azuread och använd azuresql som visas i följande exempel.

Välj ett fedauth-flöde

Använd följande tabell för att välja lämpligt flöde för din hostingmiljö och källa till legitimation:

Om du behöver koppla upp dig från... Börja med... Använd när...
Lokal utveckling ActiveDirectoryDefault Du vill återanvända Azure CLI- eller Azure-utvecklarens CLI-uppgifter utan att konfigurera en tjänstehuvudperson eller hanterad identitet lokalt.
En Azure-hostad app med en hanterad identitet ActiveDirectoryManagedIdentity Du vill ha en förutsägbar produktionskonfiguration och vill inte ha andra lokala inloggningskällor i kedjan.
A CI/CD pipeline in Azure DevOps ActiveDirectoryAzurePipelines Din pipeline använder redan en Azure-tjänsteanslutning och exponerar SYSTEM_ACCESSTOKEN.
Kubernetes med Azure Workload Identity ActiveDirectoryWorkloadIdentity Din pod får en OIDC-tokenfil och du vill ha arbetsbelastningsidentitet istället för en klienthemlighet.
En tjänstehuvudman med en hemlighet eller certifikat ActiveDirectoryServicePrincipal Din app autentiseras som en appregistrering och du hanterar klienthemligheten eller certifikatet.
Ett verktyg som redan har en åtkomsttoken ActiveDirectoryServicePrincipalAccessToken eller en anpassad tokenleverantör Din app samlar in och uppdaterar tokens utanför föraren.
En delegerad användartoken från ett uppströms webb-API ActiveDirectoryOnBehalfOf Du behöver byta en användartoken mot en SQL-scoped token i en mellanklassig tjänst.
Ett utvecklarverktyg eller interaktivt verktyg ActiveDirectoryInteractive, ActiveDirectoryDeviceCode, ActiveDirectoryAzClieller ActiveDirectoryAzureDeveloperCli En person är närvarande för att logga in, eller så vill du återanvända en befintlig lokal CLI-session.
En Windows-only app som hanterar integrerade autentiseringskrav ActiveDirectoryIntegrated (avancerad) Du tillhandahåller anpassad tokeninsamlingslogik för integrerade scenarier.

Om du delar en reťazec pripojenia mellan lokal utveckling och Azure-hosting ActiveDirectoryDefault är det en bra startpunkt. I produktion använder du ActiveDirectoryManagedIdentity eller ActiveDirectoryServicePrincipal för att undvika latensen i autentiseringskedjan.

Installera azuread-paketet

Ladda ner underpaketet azuread som registrerar drivrutinen azuresql :

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

Använd azuresql-drivrutinen

Importera paketet azuread (istället för eller som tillägg till baspaketet go-mssqldb ) och öppna anslutningar genom att använda drivrutinsnamnet 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")
    // ...
}

Alla följande exempel riktar sig mot Azure SQL. Behåll encrypt=true&TrustServerCertificate=false i anslutningssträngen så att drivrutinen validerar servercertifikatet.

Fedauth-behörighetstyper

Sätt anslutningsparametern fedauth till ett av följande värden. De flesta typer mappas till en Azure Identity-legitimation från paketetazidentity. ActiveDirectoryServicePrincipalAccessToken och anpassade tokenleverantörs-API:er använder tokens som anroparen tillhandahåller.

ActiveDirectoryDefault

Använder azidentity.DefaultAzureCredential, som försöker använda följande källor för autentiseringsuppgifter i följande ordning:

  1. Miljövariabler (AZURE_TENANT_ID, AZURE_CLIENT_ID, och så vidare).
  2. Arbetslastsidentitet för Kubernetes.
  3. Hanterad identitet.
  4. Autentiseringsuppgifter för Azure CLI.
  5. Autentiseringsuppgifter för Azure Developer CLI.
sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false

Använd denna typ för lokal utveckling eftersom den automatiskt plockar upp Azure CLI-uppgifter. I produktion använder du ActiveDirectoryManagedIdentity eller ActiveDirectoryServicePrincipal direkt. DefaultAzureCredential går igenom varje inloggningskälla på den första anslutningen, vilket lägger till latens som produktionsarbetsbelastningar inte behöver.

ActiveDirectoryManagedIdentity

Autentiserar med en systemtilldelad eller användartilldelad hanterad identitet. För en användartilldelad identitet, ange klient-ID i parametern user id :

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

Med en användartilldelad identitet:

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

Anmärkning

ActiveDirectoryMSI är ett alias för ActiveDirectoryManagedIdentity.

ActiveDirectoryServicePrincipal

Autentisera som tjänsteprincipal (appregistrering) med ett klient-ID och klienthemlighet:

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

För autentisering av certifikatbaserade tjänstehuvudpersoner, använd clientcertpath=<path-to-certificate> tillsammans med password=<certificate-password>.

Anmärkning

ActiveDirectoryApplication är ett alias för ActiveDirectoryServicePrincipal.

ActiveDirectoryServicePrincipalAccessToken

Använder en förinköpt service principal access-token som din applikation skickar direkt i reťazec pripojenia:

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

Använd detta flöde endast när din applikation redan har hämtat och uppdaterat åtkomsttoken utanför drivrutinen. För de flesta service-to-service-scenarier, föredra ActiveDirectoryServicePrincipal eller en anpassad tokenleverantör.

ActiveDirectoryPassword

Important

Autentiseringsalternativet ActiveDirectoryPassword (Microsoft Entra ID-lösenordsautentisering) har fasats ut i Microsoft SQL-drivrutinerna. Det här högriskautentiseringsflödet är inte kompatibelt med obligatorisk Microsoft Entra multifaktorautentisering (MFA) och kanske inte fungerar i klientorganisationer där MFA tillämpas. Planera att migrera till en annan Microsoft Entra autentiseringsmetod.

Microsoft Entra ID:s lösenordsautentisering baseras på OAuth 2.0 Resource Owner Password Credentials (ROPC)-beviljandet, vilket gör det möjligt för ett program att logga in användaren genom att direkt hantera användarens lösenord.

Microsoft rekommenderar att du inte använder ROPC-flödet eftersom det är inkompatibelt med MFA. I de flesta scenarier är säkrare alternativ tillgängliga och rekommenderas. Det här flödet kräver en hög grad av förtroende för programmet och medför risker som inte finns i andra flöden. Använd endast det här flödet när säkrare flöden inte är livskraftiga. Microsoft flyttar från det här högriskautentiseringsflödet för att skydda användare från skadliga attacker. Mer information finns i Planera för obligatorisk multifaktorautentisering för Azure.

När en användare är närvarande vid inloggning använder du ActiveDirectoryInteractive eller ActiveDirectoryIntegrated-autentisering så att spårningsspårsattributen för den inloggade användaren och principer för villkorsstyrd åtkomst gäller.

För obevakade tjänst-till-tjänst-scenarier följer du vägledningen för Microsoft Entra tjänstkonto:

  • Om programmet körs på Azure infrastruktur använder du ActiveDirectoryMSI (eller ActiveDirectoryManagedIdentity i vissa drivrutiner). Hanterade identiteter eliminerar kostnaderna för att underhålla och rotera hemligheter och certifikat.
  • Om den hanterade identiteten inte är tillgänglig (till exempel om programmet körs utanför Azure) använder du ActiveDirectoryServicePrincipal. Där drivrutinen stöder det föredrar du ett klientcertifikat framför en klienthemlighet. Med ett certifikat finns den privata nyckeln kvar på klienten och endast en signerad försäkran skickas till Microsoft Entra för att autentisera klienten. Om nyckeln lagras i maskinvara (till exempel en TPM eller HSM) eller markeras som icke-exporterbar kan den inte kopieras ut som en sträng på det sätt som en klienthemlighet kan göra.
  • Använd inte ett Microsoft Entra användarkonto som ett tjänstkonto.

Autentiserar med ett Microsoft Entra-användarnamn och lösenord:

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

Parametern applicationclientid krävs för detta flöde.

ActiveDirectoryInteractive

Öppnar en webbläsarbaserad interaktiv inloggningsprompt för användaren. Lämpliga för lokala utvecklingsverktyg:

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

Parametern applicationclientid krävs för detta flöde.

ActiveDirectoryDeviceCode

Visar en enhetskod som användaren ska ange vid https://microsoft.com/devicelogin. Användbart för miljöer utan webbläsare:

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

ActiveDirectoryAzCli

Använder token från den inloggade Azure CLI-sessionen:

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

ActiveDirectoryAzureDeveloperCli

Använder token från den inloggade Azure Developer CLI (azd) sessionen:

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

ActiveDirectoryEnvironment

Läser inloggningsuppgifter från miljövariabler. Azure Identity-biblioteket inspekterar variabler som AZURE_TENANT_ID, AZURE_CLIENT_ID, och AZURE_CLIENT_SECRET:

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

ActiveDirectoryWorkloadIdentity

Autentisera genom att använda arbetsbelastningsidentitetsfederation. Använd denna metod i Kubernetes-poddar med Azure Workload Identity konfigurerat.

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

ActiveDirectoryAzurePipelines

Autentisera genom att använda en Azure-pipelines-tjänsteanslutning. Ange pipelineparametrarna i reťazec pripojenia, eller låt drivrutinen läsa saknade värden från Azure-pipelines-miljövariabler.

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

Ställ in parametrar som krävs av drivrutinen:

Parameter Description
user id Service principal client ID, valfritt följt av @tenant-id.
serviceconnectionid Service connection ID från Azure DevOps.
systemtoken Pipelinesystemets åtkomsttoken ($(System.AccessToken)).

ActiveDirectoryClientAssertion

Autentisera genom att använda en klientassertion (en signerad JWT-token) istället för en klienthemlighet. Ange den signerade JWT i parametern clientassertion :

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

ActiveDirectoryOnBehalfOf

Autentiserar genom att använda On-Behalf-Of (OBO)-flödet. Drivrutinen byter ut en uppströms användartoken mot en ny token som är begränsad till 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

Klientautentiseringsdelen kan använda password, clientcertpath, eller clientassertion, men userassertion det krävs alltid.

ActiveDirectoryIntegrated

Stöder ett avancerat arbetsflöde för integrerad autentisering. Detta läge kräver anpassad tokeninsamlingslogik via en tokenleverantör.

Använd detta läge endast på Windows. På Linux och macOS, använd en anpassad tokenleverantör för ditt autentiseringsflöde.

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

Leverantör av anpassade token

Om ingen av de inbyggda fedauth typerna passar ditt scenario, använd ett av dessa tokenleverantörs-API:er för att tillhandahålla din egen tokeninsamlingslogik:

Använd detta API när du har en förinköpt OAuth2-åtkomsttoken:

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 (Förenklat API)

Använd detta API för enklare tokeninsamling utan kontexthantering.

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 (anpassade ADAL-arbetsflöden)

Använd detta API för anpassade arbetsflöden för Azure AD-tokeninsamling när varken de inbyggda fedauth lägena eller SecurityToken-API:erna passar ditt scenario:

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)

Denna metod är användbar när du behöver integrera med en anpassad identitetsleverantör, implementera token caching eller hantera en inloggningstyp som inte täcks av paketet azuread . De flesta applikationer bör använda NewSecurityTokenConnector med en token som hämtats i förväg.

Vanliga behörighetsalternativ

Dessa parametrar gäller för flera fedauth-typer:

Parameter Description
applicationclientid Klientapplikations-ID. Krävs för ActiveDirectoryPassword och ActiveDirectoryInteractive.
clientcertpath Väg till en PEM- eller PFX-klientcertifikatfil för certifikatbaserad tjänsteprincip eller On-Behalf-Of-autentisering.
clientassertion Signerad JWT-assertion för ActiveDirectoryClientAssertion eller autentisering med On-Behalf-Of.
serviceconnectionid ID för Azure-pipelines-tjänstanslutning.
systemtoken Azure-pipelines systemåtkomsttoken.
userassertion Uppströms användartoken för ActiveDirectoryOnBehalfOf.
tokenfilepath Väg till OIDC-tokenfilen för ActiveDirectoryWorkloadIdentity i Kubernetes.
additionallyallowedtenants Komma-separerad lista över ytterligare tenant-ID som tillåts när multitenant-autentisering behövs.
disableinstancediscovery Ange true för att inaktivera instansidentifiering; använd endast om du har kontroll över auktoritets-URL:en.
sendcertificatechain Ställ in på true att skicka certifikatkedjan för certifikatbaserad autentisering.