Authentification des flux avec les fournisseurs d’informations d’identification pour nuget.exe

Soutien a été ajouté dans la version 3.3 pour les fournisseurs d’informations d’identification spécifiques (v1) nuget.exe. Depuis lors, dans la version 4.8le support des fournisseurs d'informations d'identification (v2) qui fonctionnent dans tous les types de scénarios de ligne de commande (nuget.exe, dotnet.exe, msbuild.exe) a été ajouté.

Pour plus d’informations sur toutes les approches d’authentification, consultez Consommation de packages à partir de flux authentifiés .

nuget.exe découverte du fournisseur de données d'identification

nuget.exe fournisseurs d’informations d’identification peuvent être utilisés de 3 façons :

  • Globalement : pour rendre un fournisseur de justificatifs d'identité disponible pour toutes les instances exécutées nuget.exe sous le profil de l’utilisateur actuel, ajoutez-le à %LocalAppData%\NuGet\CredentialProviders. Vous devrez peut-être créer le CredentialProviders dossier. Les fournisseurs d’informations d’identification peuvent être installés à la racine du CredentialProviders dossier ou dans un sous-dossier. Si un fournisseur d’informations d’identification a plusieurs fichiers/assemblys, vous pouvez utiliser des sous-dossiers pour maintenir l’organisation des fournisseurs.

  • À partir d’une variable d’environnement : les fournisseurs d’informations d’identification peuvent être stockés n’importe où et accessibles nuget.exe en définissant la %NUGET_CREDENTIALPROVIDERS_PATH% variable d’environnement sur l’emplacement du fournisseur. Cette variable peut être une liste séparée par des points-virgules (par exemple, path1;path2) si vous avez plusieurs emplacements.

  • Parallèlement à nuget.exe: Les fournisseurs d'informations d'identification pour nuget.exe peuvent être placés dans le même dossier que nuget.exe.

Lors du chargement des fournisseurs d’informations d’identification, nuget.exe recherche les emplacements ci-dessus, dans l’ordre, pour tout fichier nommé credentialprovider*.exe, puis charge ces fichiers dans l’ordre dans lequel ils sont trouvés. Si plusieurs fournisseurs d’informations d’identification existent dans le même dossier, ils sont chargés par ordre alphabétique.

Création d’un fournisseur de credentials nuget.exe

Un fournisseur d’informations d’identification est un exécutable de ligne de commande, nommé dans le formulaire CredentialProvider*.exe, qui rassemble les entrées, acquiert les informations d’identification selon les besoins, puis retourne le code d’état de sortie approprié et la sortie standard.

Un fournisseur doit effectuer les opérations suivantes :

  • Déterminez s’il peut fournir des informations d’identification pour l’URI ciblé avant de lancer l’acquisition d’informations d’identification. Si ce n’est pas le cas, il doit retourner le code d’état 1 sans informations d’identification.
  • Ne pas modifier NuGet.Config (par exemple, définir les informations d’identification là-bas).
  • Gérez la configuration du proxy HTTP elle-même, car NuGet ne fournit pas d’informations de proxy au plug-in.
  • Retournez des informations d’identification ou des détails d’erreur à nuget.exe en écrivant un objet de réponse JSON (voir ci-dessous) dans STDOUT, à l’aide de l’encodage UTF-8.
  • Si vous le souhaitez, émettez une journalisation de trace supplémentaire à stderr. Aucun secret ne doit jamais être écrit dans stderr, car à des niveaux de verbosité « normal » ou « détaillé », de telles traces sont échoées par NuGet à la console.
  • Les paramètres inattendus doivent être ignorés, ce qui offre une compatibilité ascendante avec les futures versions de NuGet.

Paramètres d’entrée

Paramètre/commutateur Descriptif
Uri {value} URI source du package nécessitant des informations d’identification.
Non interactif S’il est présent, le fournisseur n’émet pas d’invites interactives.
IsRetry Si elle est présente, indique que cette tentative est une nouvelle tentative d’une tentative ayant échoué précédemment. Les fournisseurs utilisent généralement cet indicateur pour s’assurer qu’ils contournent tout cache existant et demandent de nouvelles informations d’identification si possible.
Niveau de verbosité {value} S’il est présent, l’une des valeurs suivantes : « normal », « silencieux » ou « détaillé ». Si aucune valeur n’est fournie, la valeur par défaut est « normale ». Les fournisseurs doivent l’utiliser comme indication du niveau de journalisation facultatif à émettre dans le flux d’erreur standard.

Codes de sortie

Code Résultat Descriptif
0 Success Les informations d’identification ont été acquises avec succès et ont été écrites dans stdout.
1 FournisseurNonApplicable Le fournisseur actuel ne fournit pas d’informations d’identification pour l’URI donné.
2 Failure Le fournisseur est le fournisseur correct pour l’URI donné, mais ne peut pas fournir d’informations d’identification. Dans ce cas, nuget.exe n’effectue pas de nouvelle tentative d’authentification et échoue. Par exemple, lorsqu’un utilisateur annule une connexion interactive.

Sortie standard

Propriété Remarques
Nom d’utilisateur Nom d’utilisateur pour les demandes authentifiées.
Mot de passe Mot de passe pour les demandes authentifiées.
Message Détails facultatifs sur la réponse, utilisés uniquement pour afficher des détails supplémentaires dans les cas d’échec.

Exemple stdout :

{ "Username" : "freddy@example.com",
    "Password" : "bwm3bcx6txhprzmxhl2x63mdsul6grctazoomtdb6kfbof7m3a3z",
    "Message"  : "" }

Résolution des problèmes d’un fournisseur de justificatifs

À l'heure actuelle, NuGet n'offre pas un soutien direct pour le débogage de fournisseurs d'identifiants personnalisés. Le problème 4598 assure le suivi de ce travail.

Vous pouvez également effectuer les opérations suivantes :

  • Exécutez nuget.exe avec le -verbosity commutateur pour inspecter la sortie détaillée.

  • Ajoutez des messages de débogage à stdout aux endroits appropriés.

  • Assurez-vous que vous utilisez nuget.exe 3.3 ou version ultérieure.

  • Attachez le débogueur au démarrage avec cet extrait de code :

    while (!Debugger.IsAttached)
    {
        System.Threading.Thread.Sleep(100);
    }
    Debugger.Break();