Condividi tramite


Utilizzo di pacchetti da feed autenticati

Molte operazioni NuGet, ad esempio il ripristino e l'installazione, richiedono la comunicazione con una o più origini di pacchetti, che possono essere configurate nei file nuget.config. Per i feed HTTP, NuGet effettuerà una richiesta non autenticata e, se il server risponde con una risposta HTTP 401, NuGet cercherà le credenziali nell'ordine seguente:

  1. Variabile NuGetPackageSourceCredentials_{name}di ambiente .
  2. Credenziali nei file nuget.config.
  3. Usare un provider di credenziali NuGet, se l'origine del pacchetto ne fornisce una.

Le credenziali da usare sono determinate dall'origine del pacchetto. Pertanto, a meno che non si usi un provider di credenziali, è necessario verificare con l'origine del pacchetto le credenziali da usare. È molto comune che le origini dei pacchetti impediscano l'uso della password (che si accede al sito Web con) con NuGet. In genere è necessario creare un token di accesso personale da usare come password di NuGet, ma è necessario controllare la documentazione relativa al server NuGet in uso. Alcune origini di pacchetti, ad esempio Azure DevOps e GitHub, hanno token di accesso con ambito, quindi potrebbe essere necessario assicurarsi che tutti i token creati includano l'ambito richiesto.

Procedure consigliate per la sicurezza per la gestione delle credenziali

Anche se NuGet cerca le credenziali nell'ordine indicato in precedenza, è consigliabile usare la sequenza seguente per gestire in modo sicuro le credenziali durante l'autenticazione con feed privati:

  1. Provider di credenziali: è consigliabile usare un provider di credenziali quando possibile. Questo approccio evita di archiviare segreti in testo normale e riduce al minimo il rischio di esporre accidentalmente i segreti tramite il controllo del codice sorgente. Inoltre, in genere riduce il numero di posizioni che è necessario aggiornare quando una credenziale scade o cambia. Se il provider di credenziali supporta l'accesso Single Sign-On, può diminuire la frequenza degli accessi o il numero di posizioni in cui è necessario salvare le credenziali. Per altre informazioni, vedere la sezione Provider di credenziali.

  2. Credenziali crittografate in nuget.config: se un provider di credenziali non è disponibile, è consigliabile usare le credenziali crittografate. Questo approccio offre un livello aggiuntivo di sicurezza archiviando le credenziali in un formato crittografato. Per altre informazioni, vedere la sezione relativa alle credenziali nei file nuget.config.

    Nota

    Tenere presente che le password crittografate sono supportate solo in Windows. Inoltre, possono essere decrittografati solo nello stesso computer e dallo stesso utente che le ha originariamente crittografate.

  3. Uso delle macro delle variabili di ambiente in nuget.config: se si usano credenziali crittografate non è possibile, è consigliabile archiviare le credenziali nel file nuget.config con macro delle variabili di ambiente. Questo approccio consente di fare riferimento alle variabili di ambiente che contengono le credenziali effettive. Migliora la trasparenza e aiuta gli utenti finali a comprendere come vengono configurate le credenziali. Per altre informazioni, vedere la sezione relativa alle credenziali nei file nuget.config.

  4. Usando direttamente le variabili di ambiente: come opzione di fallback, è possibile archiviare le credenziali direttamente nelle variabili di ambiente. Tenere tuttavia presente che questo approccio può offrire una visibilità e un controllo inferiori rispetto all'uso di macro delle variabili di ambiente nel file nuget.config . Per altre informazioni, vedere la sezione relativa alle credenziali nelle variabili di ambiente.

  5. Cancella credenziali di testo in NuGet.Config: è consigliabile usare una delle opzioni indicate in precedenza. Se queste opzioni non sono fattibili, è possibile archiviare le credenziali nel file nuget.config . Tuttavia, questa opzione deve essere usata solo negli ambienti in cui non è disponibile nessun'altra opzione sicura. Per altre informazioni, vedere la sezione relativa alle credenziali nei file nuget.config.

    Avviso

    L'archiviazione delle credenziali in testo non crittografato nel file nuget.config , soprattutto quando si salva il file nel controllo del codice sorgente, è rischioso perché aumenta la probabilità di perdite accidentali di credenziali. Se è necessario archiviare le credenziali nel file nuget.config , è consigliabile usare una delle opzioni più sicure indicate in precedenza.

Rispettando queste procedure consigliate, è possibile autenticare in modo sicuro i feed privati riducendo al minimo il rischio di esposizione delle informazioni riservate.

Credenziali nelle variabili di ambiente

NuGet cercherà una variabile di ambiente denominata NuGetPackageSourceCredentials_{name}, dove {name} è il valore di key="name" nell'origine del pacchetto del file nuget.config . Il valore della variabile di ambiente deve essere Username={username};Password={password}e può includere ;ValidAuthenticationTypes={types}facoltativamente . Se la variabile di ambiente non corrisponde alla convenzione di NuGet o il valore non soddisfa il modello previsto di NuGet, NuGet ignorerà automaticamente la variabile di ambiente e continuerà a cercare le credenziali per l'origine del pacchetto altrove. Non sono presenti log per segnalare che NuGet usa le credenziali della variabile di ambiente, che può causare difficoltà nel debug dei problemi di autenticazione se la variabile di ambiente contiene un segreto scaduto e il nuovo segreto viene aggiunto a un file nuget.config , poiché il file di configurazione ha una precedenza inferiore.

Suggerimento

L'uso di variabili di ambiente nelle pipeline CI/CD è un'ottima scelta per ridurre al minimo il rischio di acquisizione dei segreti nei log.

Si consideri ad esempio il file nuget.config seguente:

<configuration>
  <packageSources>
    <clear />
    <add key="Contoso" value="https://nuget.contoso.com/v3/index.json" />
  </packageSources>
</configuration>

In questo caso, il nome dell'origine è Contoso e NuGet cercherà il nome NuGetPackageSourceCredentials_Contosodella variabile di ambiente . Alcune piattaforme fanno distinzione tra maiuscole e minuscole, quindi prestare attenzione all'uso dei caratteri maiuscoli e minuscoli corretti per il nome dell'ambiente e il nome dell'origine, come definito nel file nuget.config .

Se il nome utente è e la password è nugetUsersecret123, il valore della variabile di ambiente deve essere impostato su Username=nugetUser;Password=secret123. Se NuGet deve usare questa credenziale solo per l'autenticazione HTTP Basic, ma non altri schemi di autenticazione, è possibile impostare il valore della variabile di ambiente su Username=nugetUser;Password=secret123;ValidAuthenticationTypes=Basic. Per altre informazioni sui tipi di autenticazione validi, vedere la documentazione sulle credenziali del pacchetto nei file nuget.config.

Nota

Le variabili di ambiente hanno restrizioni sui caratteri consentiti e i diversi sistemi operativi possono avere restrizioni diverse. Ad esempio, gli spazi non sono consentiti. Pertanto, si usa questa funzionalità di variabile di ambiente per specificare le credenziali NuGet per le origini del pacchetto che usano caratteri non validi per le variabili di ambiente della piattaforma. In questi casi, è necessario rinominare l'origine del pacchetto nel file nuget.config .

Credenziali nei file nuget.config

I file nuget.config possono contenere le credenziali dell'origine del pacchetto. Per altre informazioni, inclusa la sintassi, vedere la sezione relativa alla documentazione di riferimento del file nuget.config sulle credenziali dell'origine del pacchetto. Tuttavia, è più facile usare dotnet nuget update source nella riga di comando per impostare le credenziali.

Avviso

Prestare attenzione quando si impostano le credenziali nei file nuget.config , soprattutto quando si salvano le credenziali come testo normale. Se la credenziale viene scritta in un file nuget.config presente nel controllo del codice sorgente, esiste un rischio maggiore di perdita accidentale del segreto.

Poiché NuGet accumula le impostazioni da più file, è consigliabile salvare le credenziali nel file nuget.config dell'utente. È anche consigliabile salvare le origini dei pacchetti nel file nuget.config della soluzione (repository del codice sorgente), incluso un <clear /> elemento, per l'affidabilità della compilazione.

Il nome utente e la password di testo normale in un file nuget.config possono usare una variabile di ambiente aggiungendo % all'inizio e alla fine del nome della variabile di ambiente che si vuole usare. Per altre informazioni, vedere la documentazione di riferimento su nuget.config sull'uso delle variabili di ambiente.

Provider di credenziali

NuGet ha un modello di estendibilità, consentendo ai plug-in di fornire credenziali NuGet. Il percorso che i provider di credenziali devono essere installati, per consentire a NuGet di individuare, è diverso per .NET Framework (NuGet.exe, MSBuild e Visual Studio) e .NET SDK (in esecuzione nel runtime .NET 5+).

NuGet prevede l'esecuzione in modalità interattiva o non interattiva. Quando in modalità non interattiva, ai provider di credenziali viene chiesto di non bloccare NuGet. In modalità interattiva, il provider di credenziali potrebbe richiedere l'accesso. Diversi strumenti hanno impostazioni predefinite diverse, quindi la modalità interattiva potrebbe dover essere esplicita o rifiutare esplicitamente, a seconda dello scenario.

Tool Default Attivazione/disattivazione
dotnet interfaccia della riga di comando non interattivo --interactive discussione. Ad esempio: dotnet restore --interactive.
MSBuild non interattivo NuGetInteractive Proprietà MSBuild. Ad esempio: msbuild -t:restore -p:NuGetInteractive=true.
NuGet.exe interattivo -NonInteractive discussione. Ad esempio: nuget.exe restore -NonInteractive.
Visual Studio interattivo non è possibile eseguire in modalità non interattiva.

NuGet.exe supporta provider di credenziali V1 e V2, mentre MSBuild e .NET SDK supportano solo i plug-in multipiattaforma (V2).

In Visual Studio NuGet ha un'interfaccia del provider di credenziali di Visual Studio, che i provider di credenziali possono usare per offrire un'esperienza di accesso grafico o chiamare le API di Visual Studio, se necessario. NuGet in Visual Studio eseguirà il fallback ai provider di credenziali della riga di comando se non riesce a trovare un provider di credenziali di Visual Studio che gestisce l'origine.

Visual Studio 2017 versione 15.9 e successive include un provider di credenziali per Azure Artifacts, che funziona in Visual Studio, MSBuild e NuGet.exe. Tuttavia, il provider di credenziali per .NET SDK non è incluso in Visual Studio, quindi deve essere installato separatamente per funzionare con l'interfaccia della dotnet riga di comando.

Elenco di provider di credenziali

Esiste una richiesta di funzionalità per rendere installabili i provider di credenziali tramite gli strumenti .NET e ciò consentirà probabilmente di individuare più facilmente altri provider di credenziali. Fino a quando non viene implementato, di seguito è riportato un elenco di provider di credenziali di cui si è a conoscenza: