Autenticazione Microsoft Entra ID con go-mssqldb

Il go-mssqldb driver supporta l'autenticazione Microsoft Entra ID tramite il azuread pacchetto. Questo pacchetto registra un driver separato chiamato azuresql che avvolge il driver standard sqlserver con il supporto delle credenziali Microsoft Entra ID.

Attenzione

Tutti i metodi di autenticazione integrati fedauth richiedono il nome del azuresql driver (non sqlserver). Se usi sql.Open("sqlserver", ...) con un fedauth parametro, l'autenticazione fallisce silenziosamente con Login failed for user ''. Importa il azuread pacchetto e usalo azuresql come mostrato nel seguente esempio.

Scegli un flusso fedauth

Usa la seguente tabella per scegliere il flusso appropriato per il tuo ambiente di hosting e la fonte delle credenziali:

Se hai bisogno di connetterti da... Inizia con... Usa quando
Sviluppo locale ActiveDirectoryDefault Vuoi riutilizzare le credenziali interfaccia della riga di comando di Azure o Azure Developer CLI senza configurare localmente un service principal o un'identità gestita.
Un'app ospitata su Azure con un'identità gestita ActiveDirectoryManagedIdentity Vuoi una configurazione di produzione prevedibile e non altre fonti di credenziali locali nella catena.
Una pipeline CI/CD in Azure DevOps ActiveDirectoryAzurePipelines La tua pipeline utilizza già una connessione di servizio Azure ed espone SYSTEM_ACCESSTOKEN.
Kubernetes con Azure Workload Identity ActiveDirectoryWorkloadIdentity Il tuo pod riceve un file di token OIDC e vuoi usare l'identità del carico di lavoro invece di un segreto client.
Un principale di servizio con un segreto o certificato ActiveDirectoryServicePrincipal La tua app si autentica tramite una registrazione dell'app e gestisci il segreto client o il certificato.
Uno strumento che ha già un token di accesso ActiveDirectoryServicePrincipalAccessToken oppure un fornitore di token personalizzati La tua app acquisisce e aggiorna i token al di fuori del driver.
Un token utente delegato proveniente da un'API web a monte ActiveDirectoryOnBehalfOf Devi scambiare un token utente con un token SQL-scoped in un servizio di fascia media.
Uno strumento per sviluppatori o un'utilità interattiva ActiveDirectoryInteractive, ActiveDirectoryDeviceCode, ActiveDirectoryAzClio ActiveDirectoryAzureDeveloperCli C'è una persona presente per effettuare l'accesso, oppure vuoi riutilizzare una sessione CLI locale esistente.
Un'app solo per Windows che gestisce i requisiti di autenticazione integrata ActiveDirectoryIntegrated (avanzato) Fornisci una logica personalizzata di acquisizione dei token per scenari integrati.

Se condividi una stringa di connessione tra lo sviluppo locale e l'hosting Azure, ActiveDirectoryDefault è un buon punto di partenza. Per la produzione, utilizzare ActiveDirectoryManagedIdentity o ActiveDirectoryServicePrincipal per evitare la latenza della catena delle credenziali.

Installa il pacchetto azuread

Scarica il azuread sottopacchetto, che registra il azuresql driver:

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

Usa il driver AzureSQL

Importa il azuread pacchetto (al posto o in aggiunta al pacchetto base go-mssqldb ) e apri le connessioni usando il nome del azuresql driver:

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")
    // ...
}

Tutti i seguenti esempi mirano ad Azure SQL. Tieni encrypt=true&TrustServerCertificate=false nella stringa di connessione così il driver valida il certificato server.

Tipi di credenziali Fedauth

Imposta il fedauth parametro di connessione su uno dei seguenti valori. La maggior parte dei tipi corrisponde a una credenziale di Azure Identity del pacchetto azidentity. ActiveDirectoryServicePrincipalAccessToken e le API personalizzate dei provider di token utilizzano token forniti dal chiamante.

ActiveDirectoryDefault

Utilizza azidentity.DefaultAzureCredential, che prova le seguenti fonti di credenziali in ordine:

  1. Variabili ambientali (AZURE_TENANT_ID, AZURE_CLIENT_ID, e così via).
  2. Identità del carico di lavoro per Kubernetes.
  3. Identità gestita.
  4. Credenziali di interfaccia della riga di comando di Azure.
  5. Credenziali di Azure Developer CLI
sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false

Usa questo tipo per lo sviluppo locale perché rileva automaticamente le credenziali interfaccia della riga di comando di Azure. In produzione, usa ActiveDirectoryManagedIdentity o ActiveDirectoryServicePrincipal direttamente. DefaultAzureCredential esamina ogni origine delle credenziali durante la prima connessione, introducendo una latenza non necessaria per i carichi di lavoro in produzione.

ActiveDirectoryManagedIdentity

Si autentica con un'identità gestita assegnata dal sistema o dall'utente. Per un'identità assegnata dall'utente, fornisci l'ID client nel user id parametro:

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

Con un'identità assegnata dall'utente:

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

Note

ActiveDirectoryMSI è un alias per ActiveDirectoryManagedIdentity.

ActiveDirectoryServicePrincipal

Si autentica come principale di servizio (registrazione app) con un ID cliente e un segreto cliente:

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

Per l'autenticazione del service principal basata su certificato, usare clientcertpath=<path-to-certificate> insieme a password=<certificate-password>.

Note

ActiveDirectoryApplication è un alias per ActiveDirectoryServicePrincipal.

ActiveDirectoryServicePrincipalAccessToken

Utilizza un token di accesso principale di servizio preacquisito che la tua applicazione passa direttamente nella stringa di connessione:

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

Usa questo flusso solo quando la tua applicazione acquisisce e aggiorna già il token di accesso al di fuori del driver. Per la maggior parte degli scenari da servizio a servizio, è preferibile usare ActiveDirectoryServicePrincipal o un provider di token personalizzato.

ActiveDirectoryPassword

Important

L'opzione di autenticazione ActiveDirectoryPassword (autenticazione Microsoft Entra ID password) è deprecata nei driver SQL Microsoft. Questo flusso di autenticazione ad alto rischio non è compatibile con l'autenticazione a Microsoft Entra più fattori (MFA) obbligatoria e potrebbe non funzionare nei tenant in cui viene applicata l'autenticazione a più fattori. Pianificare la migrazione a un metodo di autenticazione Microsoft Entra diverso.

L'autenticazione tramite password di Microsoft Entra ID si basa sul flusso di concessione Resource Owner Password Credentials (ROPC) di OAuth 2.0, che consente a un'applicazione di eseguire l'accesso dell'utente gestendone direttamente la password.

Microsoft consiglia di non usare il flusso ROPC perché non è compatibile con MFA. Per la maggior parte degli scenari sono disponibili e consigliate alternative più sicure. Questo flusso richiede un elevato livello di attendibilità nell'applicazione e comporta rischi che non sono presenti in altri flussi. Usare questo flusso solo quando non sono validi flussi più sicuri. Microsoft si sta allontanando da questo flusso di autenticazione ad alto rischio per proteggere gli utenti da attacchi dannosi. Per altre informazioni, vedere Pianificazione dell'autenticazione a più fattori obbligatoria per Azure.

Quando un utente è presente durante l'accesso, usare l'autenticazione ActiveDirectoryInteractive o ActiveDirectoryIntegrated in modo che la traccia di controllo venga attribuita all'utente che ha effettuato l'accesso e si applichino i criteri di Accesso Condizionale.

Per gli scenari non presidiati servizio-servizio, seguire le linee guida sugli account di servizio Microsoft Entra:

  • Se l'applicazione viene eseguita nell'infrastruttura Azure, usare ActiveDirectoryMSI (o ActiveDirectoryManagedIdentity in alcuni driver). Le identità gestite eliminano il sovraccarico di gestione e rotazione di segreti e certificati.
  • Se l'identità gestita non è disponibile( ad esempio, l'applicazione viene eseguita all'esterno di Azure), usare ActiveDirectoryServicePrincipal. Se il driver lo supporta, preferire un certificato client anziché un segreto del client. Con un certificato, la chiave privata rimane sul client e solo un'asserzione firmata viene inviata a Microsoft Entra per autenticare il client. Se la chiave viene archiviata nell'hardware (ad esempio un TPM o un modulo di protezione hardware) o contrassegnata come non esportabile, non può essere copiata come stringa nel modo in cui un segreto client può.
  • Non usare un account utente Microsoft Entra come account del servizio.

Autentica con un nome utente e una password 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

Il applicationclientid parametro è richiesto per questo flusso.

ActiveDirectoryInteractive

Apre un prompt interattivo di accesso basato sul browser per l'utente. Adatti per strumenti di sviluppo locale:

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

Il applicationclientid parametro è richiesto per questo flusso.

ActiveDirectoryDeviceCode

Visualizza un codice dispositivo che l'utente può inserire in https://microsoft.com/devicelogin. Utile per ambienti senza browser:

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

ActiveDirectoryAzCli

Utilizza il token della sessione interfaccia della riga di comando di Azure logata:

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

ActiveDirectoryAzureDeveloperCli

Utilizza il token dalla sessione Azure Developer CLI (azd) logata:

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

Ambiente Active Directory

Legge le credenziali dalle variabili ambientali. La libreria Azure Identity ispeziona variabili come AZURE_TENANT_ID, AZURE_CLIENT_ID, e AZURE_CLIENT_SECRET:

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

ActiveDirectoryWorkloadIdentity

Autentica utilizzando la federazione delle identità del carico di lavoro. Usa questo metodo nei pod Kubernetes con Azure Workload Identity configurato.

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

ActiveDirectoryAzurePipelines

Autentica utilizzando una connessione di servizio Azure Pipelines. Fornisci i parametri della pipeline nella stringa di connessione, oppure lascia che il driver legga i valori mancanti dalle variabili dell'ambiente 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

Imposta i parametri richiesto dal driver:

Parametro Description
user id ID client principale di servizio, opzionalmente seguito da @tenant-id.
serviceconnectionid ID connessione al servizio da Azure DevOps.
systemtoken Il token di accesso del sistema pipeline ($(System.AccessToken)).

ActiveDirectoryClientAssertion

Autentica utilizzando un'asserzione del client (un token JWT firmato) invece di un segreto client. Fornisci il JWT firmato clientassertion nel parametro:

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

ActiveDirectoryOnBehalfOf

Autentica tramite il flusso On-Behalf-Of (OBO). Il driver scambia un token utente upstream con un nuovo token con ambito limitato a 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

La fase di autenticazione del client può usare password, clientcertpath, o clientassertion, ma userassertion è sempre richiesta.

ActiveDirectoryIntegrated

Supporta un flusso di lavoro di autenticazione integrata avanzato. Questa modalità richiede una logica personalizzata di acquisizione dei token tramite un fornitore di token.

Usa questa modalità solo su Windows. Su Linux e macOS, usa un provider di token personalizzato per il flusso di autenticazione.

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

Fornitore di token personalizzati

Se nessuno dei tipi integrati fedauth è adatto al tuo scenario, usa una di queste API del provider di token per fornire una logica personalizzata per l'acquisizione dei token:

Usa questa API quando hai un token di accesso OAuth2 pre-acquisito:

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 (API semplificata)

Usa questa API per un'acquisizione di token più semplice senza gestire il contesto.

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 (flussi di lavoro ADAL personalizzati)

Usa questa API per flussi di lavoro personalizzati di acquisizione token Azure AD quando né le modalità integrate fedauth né le API SecurityToken si adattano al tuo 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)

Questo approccio è utile quando è necessario integrarsi con un fornitore di identità personalizzato, implementare la cache dei token o gestire un tipo di credenziale non coperto dal azuread pacchetto. La maggior parte delle applicazioni dovrebbe usare NewSecurityTokenConnector con un token acquisito in precedenza.

Opzioni di credenziali comuni

Questi parametri si applicano a più tipi di fedauth:

Parametro Description
applicationclientid ID dell'applicazione client. Richiesto per ActiveDirectoryPassword e ActiveDirectoryInteractive.
clientcertpath Percorso verso un file di certificato client PEM o PFX per l'autenticazione basata su certificato o On-Behalf-Of.
clientassertion Asserzione JWT firmata per ActiveDirectoryClientAssertion o autenticazione On-Behalf-Of.
serviceconnectionid ID connessione al servizio di Azure Pipelines.
systemtoken Token di accesso del sistema di Azure Pipelines
userassertion Token utente a monte per ActiveDirectoryOnBehalfOf.
tokenfilepath Percorso verso il file token OIDC per ActiveDirectoryWorkloadIdentity in Kubernetes.
additionallyallowedtenants Elenco separato da virgole di ID tenant aggiuntivi da consentire quando è necessaria l'autenticazione multitenant.
disableinstancediscovery Impostare true per disabilitare l'individuazione dell'istanza; usare solo se si controlla l'URL dell'autorità.
sendcertificatechain Imposta su true per inviare la catena di certificati per l'autenticazione basata su certificati.