Hier soll es darum gehen, wie NuGet Feeds von extern konsumiert werden können. D.h. durch Nutzer ohne Berechtigungen auf den Azure Tenant bzw. die Azure Subscription, in denen der Feed gehostet ist.
Grundsätzlich ist es natürlich möglich, den externen Nutzer einzuladen, und ihm Rechte zum Zugriff auf die Feeds zu geben. Oft ist es aber unerwünscht. Oder andere Szenarien erfordern eine Alternative.
Beispielsweise:
- Der Nutzer soll das NuGet konsumieren können, aber sonst nicht auf den Tenant zugreifen.
- Obwohl der Nutzer eigentlich bereits Rechte auf den Feed hat, treten Schwierigkeiten auf
- beim Zugriff aus älteren Tools (z.B. Visual Studio 2015),
- beim Zugriff aus neueren Tools (VS Code),
- bei Nutzung von Multi-Faktor-Authentifizierung.
- Zugriff aus Build-Agents, z.B. auf unterschiedliche Feeds.
Hierzu gibt es die Möglichkeit, mit einem „Personal Access Token“ („PAT“) zuzugreifen. Wie erstellt man diesen? Dazu benötigt man einen Nutzer, der auf den Feed berechtigt ist. Mit diesem Nutzer im DevOps Portal neben das Profil-Icon klicken und Personal access tokens auswählen:
Dann im Dialog einen sprechenden Namen vergeben. Bei Expiration ist der maximale Zeitraum mit „Custom defined“ auf ein Jahr einstellbar. Weiter einen „Custom defined“ Scope wählen und bei „Packaging“ Read auswählen. Das genügt. Nach dem Erstellen unbedingt den Token abspeichern (z.B. in KeePass), ein zweites Mal bekommt man diesen nicht zu sehen!
Wie nutzen wir diesen PAT? Er wird in der Nuget.config Datei gesetzt.
Wie bereits im konsumieren-von-nuget-feeds Artikel angedeutet, gibt es folgende Orte, wo eine Nuget.config Datei wirksam werden kann (Reihenfolge von allgemein zu speziell):
- %ProgrammData%\NuGet\Config
(für globale Konfiguration auf der Maschine, z.B. für einen Build Agent Server). - %AppData%\NuGet
(für persönliche Einstellung, muss jeder selbst einstellen). - Solution-Verzeichnis
(für alle Projekte in der Solution). - Projekt-Verzeichnis
(für ein ausgewähltes Projekt).
Je nach Bedarf die Nuget.config Datei auswählen. Für die Einbindung gibt es nun zwei Möglichkeiten:
- Nicht so gut (Sicherheit) aber einfacher: PAT im Klartext:
<thePackageSourceName>
<addkey="Username"value="totalegal"/>
<addkey="ClearTextPassword"value="DerPATimKlartext"/>
</thePackageSourceName>
- Besser (Sicherheit) aber Nuget.exe benötigt (wenn nicht schon installiert, runterladen und installieren). In einer Kommandozeile folgendes Kommando ausführen, führt dazu, dass der PAT verschlüsselt in der Nuget.config landet (in der persönlichen, kann von dort nach Bedarf kopiert werden).
<addkey="Username"value="totalegal"/>
<addkey="Password"value="PATencryptetUndSoWeiterUndSoFort="/>
</thePackageSourceName>
Das war's.
Zum Schluss noch ein paar Quell-Verweise und weiterführende Links zum Themenbereich:
- https://docs.microsoft.com/en-us/azure/devops/artifacts/get-started-nuget?view=azure-devops
- https://github.com/microsoft/artifacts-credprovider
- https://docs.microsoft.com/en-us/nuget/reference/extensibility/nuget-exe-credential-providers#creating-a-nugetexe-credential-provider
- https://docs.microsoft.com/en-us/nuget/consume-packages/consuming-packages-authenticated-feeds#nugetexe
- https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior
- https://blog.rsuter.com/how-to-use-a-private-vsts-nuget-package-feed-with-the-net-core-cli/
- https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file
- https://github.com/NuGet/docs.microsoft.com-nuget/issues/1260
Viel Freude beim Programmieren mit NuGet Feeds!
Plamen Petrow, Senior Solution Architect
QUIBIQ Schweiz AG