Share via


Nutzen von Paketen aus authentifizierten Feeds

Viele NuGet-Vorgänge, z. B. Wiederherstellen und Installieren, erfordern eine Kommunikation mit einer oder mehreren Paketquellen, die in nuget.config-Dateien konfiguriert werden können. Bei HTTP-Feeds führt NuGet eine nicht authentifizierte Anforderung aus. Wenn der Server mit einer HTTP 401-Antwort antwortet, sucht NuGet in der folgenden Reihenfolge nach Anmeldeinformationen:

  1. Als Umgebungsvariable NuGetPackageSourceCredentials_{name}.
  2. Anmeldeinformationen in nuget.config-Dateien.
  3. Verwenden Sie einen NuGet-Anmeldeinformationsanbieter, wenn ihre Paketquelle einen bereitstellt.

Die Anmeldeinformationen, die Sie verwenden müssen, werden von der Paketquelle bestimmt. Daher sollten Sie, sofern Sie keinen Anmeldeinformationsanbieter verwenden, ihre Paketquelle überprüfen, welche Anmeldeinformationen verwendet werden sollen. Es ist sehr üblich, dass Paketquellen Sie daran hindern, Ihr Passwort (mit dem Sie sich bei der Website anmelden) mit NuGet zu verbieten. In der Regel müssen Sie ein persönliches Zugriffstoken erstellen, das als NuGet-Passwort verwendet werden soll, aber Sie sollten die Dokumentation für den nuGet-Server überprüfen, den Sie verwenden. Einige Paketquellen, z. B. Azure DevOps und GitHub, verfügen über Bereichszugriffstoken, daher müssen Sie möglicherweise sicherstellen, dass alle Token, die Sie erstellen, den erforderlichen Bereich enthalten.

Bewährte Sicherheitspraktiken für die Verwaltung von Anmeldeinformationen

Obwohl NuGet in der oben genannten Reihenfolge nach Anmeldeinformationen sucht, empfehlen wir die folgende Sequenz zum sicheren Verwalten von Anmeldeinformationen beim Authentifizieren mit privaten Feeds:

  1. Anmeldeinformationsanbieter: Es wird dringend empfohlen, wann immer möglich einen Anmeldeinformationsanbieter zu verwenden. Dieser Ansatz vermeidet die Speicherung von Geheimnissen im Klartext und minimiert das Risiko der versehentlichen Preisgabe von Geheimnissen durch die Versionskontrolle. Außerdem verringert sich die Anzahl der Stellen, die Sie aktualisieren müssen, wenn die Anmeldeinformationen ablaufen oder sich ändern. Wenn der Anmeldeinformationsanbieter Single Sign-On unterstützt, kann er die Häufigkeit der Anmeldungen oder die Anzahl der Stellen, an denen Anmeldeinformationen gespeichert werden müssen, verringern. Weitere Informationen finden Sie im Abschnitt Anmeldeinformationsanbieter.

  2. Verschlüsselte Anmeldeinformationen in nuget.config: Wenn kein Anmeldeinformationsanbieter verfügbar ist, sollten Sie die Verwendung verschlüsselter Anmeldeinformationen in Betracht ziehen. Dieser Ansatz bietet eine zusätzliche Sicherheitsebene, indem die Anmeldeinformationen in einem verschlüsselten Format gespeichert werden. Weitere Informationen finden Sie im Abschnitt über Anmeldeinformationen in nuget.config-Dateien.

    Hinweis

    Bitte beachten Sie, dass verschlüsselte Passwörter nur in Windows unterstützt werden. Außerdem können sie nur auf demselben Computer und von demselben Benutzer entschlüsselt werden, der sie ursprünglich verschlüsselt hat.

  3. Umgebungsvariablenmakros in nuget.config verwenden: Wenn die Verwendung verschlüsselter Anmeldeinformationen nicht möglich ist, sollten Sie die Anmeldeinformationen in der nuget.config-Datei mit Umgebungsvariablenmakros speichern. Mit diesem Ansatz können Sie auf Umgebungsvariablen verweisen, die die tatsächlichen Anmeldeinformationen enthalten. Sie verbessert Transparenz und hilft Endbenutzern zu verstehen, wie ihre Anmeldeinformationen konfiguriert sind. Weitere Informationen finden Sie im Abschnitt über Anmeldeinformationen in nuget.config-Dateien.

  4. Umgebungsvariablen direkt verwenden: Als Fallbackoption können Sie die Anmeldeinformationen direkt in Umgebungsvariablen speichern. Beachten Sie jedoch, dass dieser Ansatz im Vergleich zur Verwendung von Umgebungsvariablenmakros in der nuget.config-Datei möglicherweise weniger Sichtbarkeit und Kontrolle bietet. Weitere Informationen finden Sie im Abschnitt über Anmeldeinformationen in Umgebungsvariablen.

  5. Textanmeldeinformationen in NuGet.Config löschen: Es wird dringend empfohlen, eine der oben genannten Optionen zu verwenden. Wenn diese Optionen nicht machbar sind, können Sie die Anmeldeinformationen in der nuget.config-Datei speichern. Diese Option sollte jedoch nur in Umgebungen verwendet werden, in denen keine andere sichere Option verfügbar ist. Weitere Informationen finden Sie im Abschnitt über Anmeldeinformationen in nuget.config-Dateien.

    Warnung

    Das Speichern von Anmeldeinformationen in der nuget.config-Datei, insbesondere beim Speichern der Datei in der Quellcodeverwaltung, ist riskant, da die Wahrscheinlichkeit von versehentlichen Verlusten an Anmeldeinformationen erhöht wird. Wenn Sie Anmeldeinformationen in der nuget.config-Datei speichern müssen, erwägen Sie die Verwendung einer der oben genannten sichereren Optionen.

Indem Sie diese bewährten Methoden einhalten, können Sie private Feeds sicher authentifizieren und gleichzeitig das Risiko vertraulicher Informationen minimieren.

Anmeldeinformationen in Umgebungsvariablen

NuGet sucht nach einer Umgebungsvariable namens NuGetPackageSourceCredentials_{name}, wobei {name} der Wert von key="name" in der Paketquelle der Nuget.config-Datei angegeben ist. Der Wert der Umgebungsvariable muss Username={username};Password={password} sein und kann optional ;ValidAuthenticationTypes={types} enthalten. Wenn die Umgebungsvariable nicht mit der NuGet-Konvention übereinstimmt oder der Wert das erwartete Muster von NuGet nicht erfüllt, ignoriert NuGet die Umgebungsvariable im Hintergrund und sucht weiterhin nach Anmeldeinformationen für die Paketquelle an anderer Stelle. Es gibt keine Protokolle, um zu signalisieren, dass NuGet die Anmeldeinformationen aus der Umgebungsvariable verwendet. Dies kann zu Problemen beim Debuggen von Authentifizierungsproblemen führen, wenn die Umgebungsvariable ein abgelaufenes Geheimnis enthält und das neue Geheimnis einer nuget.config-Datei hinzugefügt wird, da die Konfigurationsdatei eine niedrigere Rangfolge hat.

Tipp

Die Verwendung von Umgebungsvariablen in CI/CD-Pipelines ist eine ausgezeichnete Wahl, um das Risiko zu verringern, dass Geheimnisse in Protokollen erfasst werden.

Sehen Sie sich beispielsweise die folgende nuget.config-Datei:

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

In diesem Fall lautet der Quellenname Contoso und NuGet sucht nach der Umgebungsvariablen NuGetPackageSourceCredentials_Contoso. Bei einigen Plattformen wird die Groß-/Kleinschreibung beachtet. Achten Sie daher darauf, die richtigen Groß- und Kleinbuchstaben für den Umgebungsnamen und den Quellnamen zu verwenden, wie in der nuget.config-Datei definiert.

Wenn der Benutzername nugetUser und das Passwort secret123 ist, sollte der Wert der Umgebungsvariablen auf Username=nugetUser;Password=secret123 gesetzt werden. Wenn NuGet diese Anmeldeinformationen nur für die HTTP-Standardauthentifizierung, aber nicht für andere Authentifizierungsschemas verwenden soll, können Sie den Wert der Umgebungsvariable auf Username=nugetUser;Password=secret123;ValidAuthenticationTypes=Basic festlegen. Weitere Informationen zu gültigen Authentifizierungstypen finden Sie in den Dokumenten zu Paketanmeldeinformationen in nuget.config-Dateien.

Hinweis

Umgebungsvariablen haben Einschränkungen für zulässige Zeichen, und verschiedene Betriebssysteme können unterschiedliche Einschränkungen haben. Leerzeichen sind beispielsweise nicht erlaubt. Daher verwenden Sie dieses Umgebungsvariablenfunktion, um NuGet-Anmeldeinformationen für Paketquellen anzugeben, die alle Zeichen verwenden, die für die Umgebungsvariablen Ihrer Plattform ungültig sind. In solchen Fällen sollten Sie die Paketquelle in der nuget.config-Datei umbenennen.

Anmeldeinformationen in nuget.config-Dateien

nuget.config-Dateien können Paketquellanmeldeinformationen enthalten. Weitere Informationen, einschließlich Syntax, finden Sie im Abschnitt Referenzdokumente der nuget.config-Datei über Paketquellanmeldeinformationen. Es ist jedoch einfacher, dotnet nuget update source in der Befehlszeile zu verwenden, um die Anmeldeinformationen festzulegen.

Warnung

Achten Sie beim Festlegen von Anmeldeinformationen in nuget.config-Dateien, insbesondere beim Speichern der Anmeldeinformationen als Nur-Text. Wenn die Anmeldeinformationen in eine Nuget.config-Datei geschrieben werden, die sich in der Quellcodeverwaltung befindet, besteht ein erhöhtes Risiko, dass versehentlich das Geheimnis verloren geht.

Da NuGet Einstellungen aus mehreren Dateien ansammelt, wird empfohlen, Anmeldeinformationen in Ihrer nuget.config-Datei des Benutzers zu speichern. Außerdem wird empfohlen, Paketquellen in der nuget.config-Datei der Lösung (Quellcode-Repository) zu speichern, einschließlich eines <clear />-Elements, um die Zuverlässigkeit der Erstellung zu gewährleisten.

Der Benutzername und das Nur-Text-Passwort in einer nuget.config-Datei können eine Umgebungsvariable verwenden, indem Sie % an den Anfang und das Ende des Namens der Umgebungsvariable, die Sie verwenden möchten, hinzufügen. Weitere Informationen finden Sie in den Referenzdokumenten der nuget.config-Datei zur Verwendung von Umgebungsvariablen.

Anmeldeinformationsanbieter

NuGet verfügt über ein Erweiterbarkeitsmodell, sodass Plug-Ins NuGet-Anmeldeinformationen bereitstellen können. Der Pfad, in dem die Anmeldeinformationsanbieter installiert sein müssen, damit NuGet ermittelt werden kann, unterscheidet sich für .NET Framework (NuGet.exe, MSBuild und Visual Studio) und das .NET SDK (ausgeführt auf .NET 5+ Runtime).

NuGet verfügt über ein Konzept für die Ausführung im interaktiven oder nicht-interaktiven Modus. Im nicht interaktiven Modus werden Anmeldeinformationsanbieter aufgefordert, NuGet nicht zu blockieren. Im interaktiven Modus kann der Anmeldeinformationsanbieter Sie auffordern, sich anzumelden. Verschiedene Tools weisen unterschiedliche Standardwerte auf, daher muss der interaktive Modus je nach Szenario möglicherweise aktiviert oder deaktiviert werden.

Tool Standard Umschaltfläche
dotnet-CLI Nicht interaktiver --interactive-Argument. Beispiel: dotnet restore --interactive.
MSBuild Nicht interaktiver Eigenschaft von NuGetInteractive-MSBuild. Beispiel: msbuild -t:restore -p:NuGetInteractive=true.
NuGet.exe Interaktiv -NonInteractive-Argument. Beispiel: nuget.exe restore -NonInteractive.
Visual Studio Interaktiv nicht möglich, im nicht interaktiven Modus auszuführen.

NuGet.exe unterstützt sowohl V1- als auch V2-Anmeldeinformationsanbieter, während MSBuild und das .NET SDK nur die plattformübergreifenden Plugins (V2) unterstützen.

In Visual Studio verfügt NuGet über eine Visual Studio Credential Provider-Schnittstelle, die Anmeldeinformationsanbieter verwenden können, um eine grafische Anmeldung bereitzustellen, oder visual Studio-APIs bei Bedarf aufrufen. NuGet in Visual Studio greift auf die Befehlszeilenanmeldeinformationsanbieter zurück, wenn kein Visual Studio-Anmeldeinformationsanbieter gefunden wird, der die Quelle verarbeitet.

Visual Studio 2017, Version 15.9 und höher enthält einen Anmeldeinformationsanbieter für Azure Artifacts, der in Visual Studio, MSBuild und NuGet.exe funktioniert. Der Anmeldeinformationsanbieter für das .NET SDK ist jedoch nicht von Visual Studio enthalten und muss daher separat installiert werden, um mit der dotnet-CLI zu arbeiten.

Liste der Anmeldeinformationsanbieter

Es gibt eine Featureanfrage, um Anmeldeinformationsanbieter über .NET-Tools zu installieren, und dies erleichtert wahrscheinlich das Auffinden anderer Anmeldeinformationsanbieter. Bis dies implementiert ist, sehen Sie hier eine Liste der uns bekannten Anmeldeinformationsanbieter: