Sichere Speicherung von App-Geheimnissen in der Entwicklung in ASP.NET Core
Von Rick Anderson und Kirk Larkin
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
In diesem Dokument wird erläutert, wie Sie vertrauliche Daten für eine ASP.NET Core-App auf einem Entwicklungscomputer verwalten. Speichern Sie niemals Kennwörter oder andere vertrauliche Daten im Quellcode. Produktionsgeheimnisse sollten nicht für die Entwicklung oder den Test verwendet werden. Geheimnisse sollten nicht mit der App bereitgestellt werden. Stattdessen sollte auf Produktionsgeheimnisse über eine kontrollierte Methode wie Umgebungsvariablen oder Azure Key Vault zugegriffen werden. Sie können Azure-Test- und -Produktionsgeheimnisse mit dem Konfigurationsanbieter Azure Key Vault speichern und schützen.
Informationen zum Verwenden von Benutzergeheimnissen in einer .NET-Konsolen-App finden Sie in diesem GitHub-Problem.
Umgebungsvariablen
Umgebungsvariablen werden verwendet, um das Speichern von App-Geheimnissen im Code oder in lokalen Konfigurationsdateien zu vermeiden. Umgebungsvariablen setzen Konfigurationswerte für alle zuvor angegebenen Konfigurationsquellen außer Kraft.
Stellen Sie sich eine ASP.NET Core Web-App vor, in der die Sicherheit einzelner Benutzerkonten aktiviert ist. Eine Standard-Datenbankverbindungszeichenfolge ist in der Datei des appsettings.json
Projekts mit dem Schlüssel DefaultConnection
enthalten. Die Standardverbindungszeichenfolge ist für LocalDB, die im Benutzermodus ausgeführt wird und kein Kennwort erfordert. Während der App-Bereitstellung kann der Schlüsselwert mit dem DefaultConnection
Wert einer Umgebungsvariablen überschrieben werden. Die Umgebungsvariable speichert möglicherweise die vollständige Verbindungszeichenfolge mit vertraulichen Anmeldeinformationen.
Warnung
Umgebungsvariablen werden im Allgemeinen in einfachem, unverschlüsselten Text gespeichert. Wenn der Computer oder Prozess kompromittiert ist, kann auf Umgebungsvariablen von nicht vertrauenswürdigen Parteien zugegriffen werden. Möglicherweise sind zusätzliche Maßnahmen erforderlich, um die Offenlegung von Benutzergeheimnissen zu verhindern.
Das Trennzeichen :
funktioniert nicht auf allen Plattformen mit den hierarchischen Schlüsseln von Umgebungsvariablen. Der doppelte Unterstrich __
:
- wird auf allen Plattformen unterstützt. Das Trennzeichen
:
wird beispielsweise nicht von Bash unterstützt,__
hingegen schon. - automatisch durch
:
ersetzt.
Geheimnis-Manager
Das Geheimnis-Manager-Tool speichert vertrauliche Daten während der Entwicklung eines ASP.NET Core-Projekts. In diesem Kontext ist ein Teil vertraulicher Daten ein App-Geheimnis. App-Geheimnisse werden an einem anderen Speicherort als die Projektstruktur gespeichert. Die App-Geheimnisse sind einem bestimmten Projekt zugeordnet oder über mehrere Projekte hinweg freigegeben. Die App-Geheimnisse werden nicht in die Quellcodeverwaltung eingecheckt.
Warnung
Das Geheimnis-Manager-Tool verschlüsselt die gespeicherten Geheimnisse nicht und sollte nicht als vertrauenswürdiger Speicher behandelt werden. Es dient nur zu Entwicklungszwecken. Die Schlüssel und Werte werden in einer JSON-Konfigurationsdatei im Benutzerprofilverzeichnis gespeichert.
Funktionsweise des Secret Manager-Tools
Das Geheimnis-Manager-Tool blendet Implementierungsdetails aus, z. B. wo und wie die Werte gespeichert werden. Sie können das Tool verwenden, ohne diese Implementierungsdetails zu kennen. Die Werte werden in einer JSON-Datei im Benutzerprofilordner des lokalen Computers gespeichert:
Dateisystempfad:
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
Ersetzen Sie <user_secrets_id>
in den vorherigen Dateipfaden durch den UserSecretsId
in der Projektdatei angegebenen Wert.
Schreiben Sie keinen Code, der vom Speicherort oder Format der mit dem Geheimnis-Manager-Tool gespeicherten Daten abhängt. Diese Implementierungsdetails können sich ändern. Beispielsweise werden die Geheimniswerte nicht verschlüsselt, könnten aber in der Zukunft liegen.
Aktivieren des Geheimnisspeichers
Das Geheimnis-Manager-Tool arbeitet mit projektspezifischen Konfigurationseinstellungen, die in Ihrem Benutzerprofil gespeichert sind.
Das Geheimnis-Manager-Tool enthält einen init
Befehl. Um Benutzergeheimnisse zu verwenden, führen Sie den folgenden Befehl im Projektverzeichnis aus:
dotnet user-secrets init
Der vorherige Befehl fügt ein UserSecretsId
-Element innerhalb einer PropertyGroup
der Projektdatei hinzu. Standardmäßig ist der innere Text von UserSecretsId
eine GUID. Der innere Text ist beliebig, aber für das Projekt eindeutig.
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>
Klicken Sie in Visual Studio in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie im Kontextmenü Benutzergeheimnisse verwalten aus. Diese Geste fügt der Projektdatei ein UserSecretsId
Element hinzu, das mit einer GUID aufgefüllt wird.
Festlegen eines Geheimnisses
Definieren Sie ein App-Geheimnis, das aus einem Schlüssel und seinem Wert besteht. Das Geheimnis ist dem Wert des UserSecretsId
Projekts zugeordnet. Führen Sie beispielsweise den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets set "Movies:ServiceApiKey" "12345"
Im vorherigen Beispiel gibt der Doppelpunkt an, dass Movies
ein Objektliteral mit einer ServiceApiKey
-Eigenschaft ist.
Das Geheimnis-Manager-Tool kann auch aus anderen Verzeichnissen verwendet werden. Verwenden Sie die --project
Option, um den Dateisystempfad anzugeben, unter dem die Projektdatei vorhanden ist. Beispiel:
dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"
JSON-Strukturentflachung in Visual Studio
Die Visual Studio-Geste "Benutzergeheimnisse verwalten " öffnet eine secrets.json
Datei im Text-Editor. Ersetzen Sie den Inhalt von secrets.json
durch die zu speichernden Schlüssel-Wert-Paare. Beispiel:
{
"Movies": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"ServiceApiKey": "12345"
}
}
Die JSON-Struktur wird nach Änderungen über dotnet user-secrets remove
oder dotnet user-secrets set
vereinfacht. Wenn Sie z. B. ausführen dotnet user-secrets remove "Movies:ConnectionString"
, wird das Movies
Objektliteral reduziert. Die geänderte Datei ähnelt der folgenden JSON:
{
"Movies:ServiceApiKey": "12345"
}
Festlegen mehrerer Geheimnisse
Ein Batch von Geheimnissen kann festgelegt werden, JSindem On an den set
Befehl geleitet wird. Im folgenden Beispiel wird der Inhalt der input.json
Datei an den set
Befehl übergeben.
Öffnen Sie eine Befehlsshell, und führen Sie den folgenden Befehl aus:
type .\input.json | dotnet user-secrets set
Zugreifen auf ein Geheimnis
Führen Sie die folgenden Schritte aus, um auf ein Geheimnis zuzugreifen:
- Registrieren der Konfigurationsquelle für Benutzergeheimnisse
- Lesen des Geheimnisses über die Konfigurations-API
Registrieren der Konfigurationsquelle für Benutzergeheimnisse
Der Konfigurationsanbieter für Benutzergeheimnisse registriert die entsprechende Konfigurationsquelle bei der . NET-Konfigurations-API.
ASP.NET Core-Web-Apps, die mit dotnet new oder Visual Studio erstellt wurden, generieren den folgenden Code:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
WebApplication.CreateBuilder Initialisiert eine neue Instanz der WebApplicationBuilder-Klasse mit vorkonfigurierten Standardwerten. Das initialisierte WebApplicationBuilder
(builder
) stellt die Standardkonfiguration bereit und ruft auf AddUserSecrets , wenn der EnvironmentName ist Development:
Lesen des Geheimnisses über die Konfigurations-API
Sehen Sie sich die folgenden Beispiele für das Lesen des Schlüssels an Movies:ServiceApiKey
:
Datei "Program.cs":
var builder = WebApplication.CreateBuilder(args);
var movieApiKey = builder.Configuration["Movies:ServiceApiKey"];
var app = builder.Build();
app.MapGet("/", () => movieApiKey);
app.Run();
Razor Seitenmodell:
public class IndexModel : PageModel
{
private readonly IConfiguration _config;
public IndexModel(IConfiguration config)
{
_config = config;
}
public void OnGet()
{
var moviesApiKey = _config["Movies:ServiceApiKey"];
// call Movies service with the API key
}
}
Weitere Informationen finden Sie unter Konfiguration in ASP.NET Core.
Zuordnen von Geheimnissen zu einem POCO
Das Zuordnen eines gesamten Objektliterals zu einem POCO (eine einfache .NET-Klasse mit Eigenschaften) ist nützlich, um verwandte Eigenschaften zu aggregieren.
Angenommen, die Datei der secrets.json
App enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Um die vorherigen Geheimnisse einem POCO zuzuordnen, verwenden Sie das Objektgraphbindungsfeature der .NET-Konfigurations-API. Der folgende Code bindet an einen benutzerdefinierten MovieSettings
POCO und greift auf den ServiceApiKey
Eigenschaftswert zu:
var moviesConfig =
Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;
Die Movies:ConnectionString
Geheimnisse und Movies:ServiceApiKey
werden den jeweiligen Eigenschaften in MovieSettings
zugeordnet:
public class MovieSettings
{
public string ConnectionString { get; set; }
public string ServiceApiKey { get; set; }
}
Ersetzen von Zeichenfolgen durch Geheimnisse
Das Speichern von Kennwörtern in Nur-Text ist unsicher. Beispielsweise kann eine in appsettings.json
gespeicherte Datenbankverbindungszeichenfolge ein Kennwort für den angegebenen Benutzer enthalten:
{
"ConnectionStrings": {
"Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
}
}
Ein sichererer Ansatz besteht darin, das Kennwort als Geheimnis zu speichern. Beispiel:
dotnet user-secrets set "DbPassword" "pass123"
Entfernen Sie das Password
Schlüssel-Wert-Paar aus der Verbindungszeichenfolge in appsettings.json
. Beispiel:
{
"ConnectionStrings": {
"Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
}
}
Der Wert des Geheimnisses kann für die Eigenschaft eines SqlConnectionStringBuilder Objekts Password festgelegt werden, um die Verbindungszeichenfolge abzuschließen:
using System.Data.SqlClient;
var builder = WebApplication.CreateBuilder(args);
var conStrBuilder = new SqlConnectionStringBuilder(
builder.Configuration.GetConnectionString("Movies"));
conStrBuilder.Password = builder.Configuration["DbPassword"];
var connection = conStrBuilder.ConnectionString;
var app = builder.Build();
app.MapGet("/", () => connection);
app.Run();
Auflisten der Geheimnisse
Angenommen, die Datei der App secrets.json
enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Führen Sie den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets list
Die folgende Ausgabe wird angezeigt:
Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345
Im vorherigen Beispiel bezeichnet ein Doppelpunkt in den Schlüsselnamen die Objekthierarchie in secrets.json
.
Entfernen eines einzelnen Geheimnisses
Angenommen, die Datei der App secrets.json
enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Führen Sie den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets remove "Movies:ConnectionString"
Die Datei der secrets.json
App wurde geändert, um das dem Schlüssel zugeordnete Movies:ConnectionString
Schlüssel-Wert-Paar zu entfernen:
{
"Movies": {
"ServiceApiKey": "12345"
}
}
dotnet user-secrets list
zeigt die folgende Meldung an:
Movies:ServiceApiKey = 12345
Entfernen aller Geheimnisse
Angenommen, die Datei der App secrets.json
enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Führen Sie den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets clear
Alle Benutzergeheimnisse für die App wurden aus der secrets.json
Datei gelöscht:
{}
Beim Ausführen dotnet user-secrets list
wird die folgende Meldung angezeigt:
No secrets configured for this application.
Verwalten von Benutzergeheimnissen mit Visual Studio
Klicken Sie zum Verwalten von Benutzergeheimnissen in Visual Studio im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Benutzergeheimnisse verwalten aus:
Migrieren von Benutzergeheimnissen von ASP.NET Framework zu ASP.NET Core
Weitere Informationen finden Sie im entsprechenden GitHub-Issue.
Zusätzliche Ressourcen
- Informationen zum Zugriff auf Benutzergeheimnisse über IIS finden Sie in diesem Problem .
- Konfiguration in ASP.NET Core
- Azure Key Vault-Konfigurationsanbieter in ASP.NET Core
Von Rick Anderson, Kirk Larkin, Daniel Roth und Scott Addie
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
In diesem Dokument wird erläutert, wie Vertrauliche Daten für eine ASP.NET Core-App auf einem Entwicklungscomputer verwaltet werden. Speichern Sie Niemals Kennwörter oder andere vertrauliche Daten im Quellcode. Produktionsgeheimnisse sollten nicht für Entwicklung oder Test verwendet werden. Geheimnisse sollten nicht mit der App bereitgestellt werden. Stattdessen sollte der Zugriff auf Produktionsgeheimnisse über eine kontrollierte Methode wie Umgebungsvariablen oder Azure Key Vault erfolgen. Sie können Azure-Test- und -Produktionsgeheimnisse mit dem Konfigurationsanbieter Azure Key Vault speichern und schützen.
Umgebungsvariablen
Umgebungsvariablen werden verwendet, um die Speicherung von App-Geheimnissen im Code oder in lokalen Konfigurationsdateien zu vermeiden. Umgebungsvariablen überschreiben Konfigurationswerte für alle zuvor angegebenen Konfigurationsquellen.
Stellen Sie sich eine ASP.NET Core Web-App vor, in der die Sicherheit einzelner Benutzerkonten aktiviert ist. Eine Standard-Datenbankverbindungszeichenfolge appsettings.json
ist in der Projektdatei mit dem Schlüssel DefaultConnection
enthalten. Die Standardverbindungszeichenfolge ist für LocalDB, die im Benutzermodus ausgeführt wird und kein Kennwort erfordert. Während der App-Bereitstellung kann der DefaultConnection
Schlüsselwert mit dem Wert einer Umgebungsvariablen überschrieben werden. Die Umgebungsvariable kann die vollständige Verbindungszeichenfolge mit vertraulichen Anmeldeinformationen speichern.
Warnung
Umgebungsvariablen werden in der Regel in einfachem, unverschlüsselten Text gespeichert. Wenn der Computer oder Prozess kompromittiert ist, kann auf Umgebungsvariablen von nicht vertrauenswürdigen Parteien zugegriffen werden. Möglicherweise sind zusätzliche Maßnahmen erforderlich, um die Offenlegung von Benutzergeheimnissen zu verhindern.
Das Trennzeichen :
funktioniert nicht auf allen Plattformen mit den hierarchischen Schlüsseln von Umgebungsvariablen. Der doppelte Unterstrich __
:
- wird auf allen Plattformen unterstützt. Das Trennzeichen
:
wird beispielsweise nicht von Bash unterstützt,__
hingegen schon. - automatisch durch
:
ersetzt.
Geheimer Manager
Das Secret Manager-Tool speichert vertrauliche Daten während der Entwicklung eines ASP.NET Core-Projekts. In diesem Kontext ist ein Teil vertraulicher Daten ein App-Geheimnis. App-Geheimnisse werden an einem separaten Speicherort von der Projektstruktur gespeichert. Die App-Geheimnisse werden einem bestimmten Projekt zugeordnet oder über mehrere Projekte hinweg freigegeben. Die App-Geheimnisse werden nicht in die Quellcodeverwaltung eingecheckt.
Warnung
Das Geheimnis-Manager-Tool verschlüsselt die gespeicherten Geheimnisse nicht und sollte nicht als vertrauenswürdiger Speicher behandelt werden. Es dient nur zu Entwicklungszwecken. Die Schlüssel und Werte werden in einer JSON-Konfigurationsdatei im Benutzerprofilverzeichnis gespeichert.
Funktionsweise des Secret Manager-Tools
Das Tool Secret Manager blendet Implementierungsdetails aus, z. B. wo und wie die Werte gespeichert werden. Sie können das Tool verwenden, ohne diese Implementierungsdetails zu kennen. Die Werte werden in einer JSON-Datei im Benutzerprofilordner des lokalen Computers gespeichert:
Dateisystempfad:
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
Ersetzen Sie <user_secrets_id>
in den vorherigen Dateipfaden durch den UserSecretsId
in der Projektdatei angegebenen Wert.
Schreiben Sie keinen Code, der vom Speicherort oder Format der mit dem Secret Manager-Tool gespeicherten Daten abhängt. Diese Implementierungsdetails können sich ändern. Die Geheimwerte werden beispielsweise nicht verschlüsselt, könnten aber in der Zukunft liegen.
Aktivieren des geheimen Speichers
Das Secret Manager-Tool arbeitet mit projektspezifischen Konfigurationseinstellungen, die in Ihrem Benutzerprofil gespeichert sind.
Das Secret Manager-Tool enthält einen init
Befehl im .NET Core SDK 3.0.100 oder höher. Führen Sie zum Verwenden von Benutzergeheimnissen den folgenden Befehl im Projektverzeichnis aus:
dotnet user-secrets init
Mit dem vorherigen Befehl wird ein UserSecretsId
Element in einer PropertyGroup
der Projektdatei hinzugefügt. Standardmäßig ist der innere Text von UserSecretsId
eine GUID. Der innere Text ist willkürlich, aber für das Projekt eindeutig.
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>
Klicken Sie in Visual Studio in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie im Kontextmenü Benutzergeheimnisse verwalten aus. Diese Geste fügt der Projektdatei ein UserSecretsId
Element hinzu, das mit einer GUID aufgefüllt ist.
Festlegen eines Geheimnisses
Definieren Sie ein App-Geheimnis, das aus einem Schlüssel und seinem Wert besteht. Das Geheimnis ist dem Wert des UserSecretsId
Projekts zugeordnet. Führen Sie beispielsweise den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets set "Movies:ServiceApiKey" "12345"
Im vorherigen Beispiel gibt der Doppelpunkt an, dass es Movies
sich um ein Objektliteral mit einer ServiceApiKey
-Eigenschaft handelt.
Das Secret Manager-Tool kann auch aus anderen Verzeichnissen verwendet werden. Verwenden Sie die --project
Option, um den Dateisystempfad anzugeben, unter dem die Projektdatei vorhanden ist. Beispiel:
dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"
JSON-Strukturflache in Visual Studio
Die Visual Studio-Geste "Benutzergeheimnisse verwalten " öffnet eine secrets.json
Datei im Text-Editor. Ersetzen Sie den Inhalt von secrets.json
durch die zu speichernden Schlüssel-Wert-Paare. Beispiel:
{
"Movies": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"ServiceApiKey": "12345"
}
}
Die JSON-Struktur wird nach Änderungen über dotnet user-secrets remove
oder dotnet user-secrets set
vereinfacht. Wenn Sie z. B. ausführen dotnet user-secrets remove "Movies:ConnectionString"
, wird das Movies
Objektliteral reduziert. Die geänderte Datei ähnelt der folgenden JSON:
{
"Movies:ServiceApiKey": "12345"
}
Festlegen mehrerer Geheimnisse
Ein Batch von Geheimnissen kann festgelegt werden, JSindem On an den set
Befehl geleitet wird. Im folgenden Beispiel wird der Inhalt der input.json
Datei an den set
Befehl übergeben.
Öffnen Sie eine Befehlsshell, und führen Sie den folgenden Befehl aus:
type .\input.json | dotnet user-secrets set
Zugreifen auf ein Geheimnis
Führen Sie die folgenden Schritte aus, um auf ein Geheimnis zuzugreifen:
- Registrieren der Konfigurationsquelle für Benutzergeheimnisse
- Lesen des Geheimnisses über die Konfigurations-API
Registrieren der Konfigurationsquelle für Benutzergeheimnisse
Der Konfigurationsanbieter für Benutzergeheimnisse registriert die entsprechende Konfigurationsquelle bei der . NET-Konfigurations-API.
Die Konfigurationsquelle für Benutzergeheimnisse wird automatisch im Entwicklungsmodus hinzugefügt, wenn das Projekt aufruft CreateDefaultBuilder. CreateDefaultBuilder
ruft auf AddUserSecrets , wenn der EnvironmentName ist Development:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Wenn CreateDefaultBuilder
nicht aufgerufen wird, fügen Sie die Konfigurationsquelle für Benutzergeheimnisse explizit hinzu, indem Sie in ConfigureAppConfigurationaufrufenAddUserSecrets. Rufen Sie AddUserSecrets
nur auf, wenn die App in der Entwicklungsumgebung ausgeführt wird, wie im folgenden Beispiel gezeigt:
public class Program
{
public static void Main(string[] args)
{
var host = new HostBuilder()
.ConfigureAppConfiguration((hostContext, builder) =>
{
// Add other providers for JSON, etc.
if (hostContext.HostingEnvironment.IsDevelopment())
{
builder.AddUserSecrets<Program>();
}
})
.Build();
host.Run();
}
}
Lesen des Geheimnisses über die Konfigurations-API
Wenn die Konfigurationsquelle für Benutzergeheimnisse registriert ist, kann die .NET-Konfigurations-API die Geheimnisse lesen. Die Konstruktoreinschleusung kann verwendet werden, um Zugriff auf die .NET-Konfigurations-API zu erhalten. Sehen Sie sich die folgenden Beispiele für das Lesen des Schlüssels an Movies:ServiceApiKey
:
Startklasse:
public class Startup
{
private string _moviesApiKey = null;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
_moviesApiKey = Configuration["Movies:ServiceApiKey"];
}
public void Configure(IApplicationBuilder app)
{
app.Run(async (context) =>
{
var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null";
await context.Response.WriteAsync($"Secret is {result}");
});
}
}
Razor Seitenmodell:
public class IndexModel : PageModel
{
private readonly IConfiguration _config;
public IndexModel(IConfiguration config)
{
_config = config;
}
public void OnGet()
{
var moviesApiKey = _config["Movies:ServiceApiKey"];
// call Movies service with the API key
}
}
Weitere Informationen finden Sie unter Zugriffskonfiguration im Start und Zugriffskonfiguration in Razor Pages.
Zuordnen von Geheimnissen zu einem POCO
Das Zuordnen eines gesamten Objektliterals zu einem POCO (eine einfache .NET-Klasse mit Eigenschaften) ist nützlich, um verwandte Eigenschaften zu aggregieren.
Angenommen, die Datei der secrets.json
App enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Verwenden Sie zum Zuordnen der vorherigen Geheimnisse zu einem POCO das Objektgraphbindungsfeature der .NET-Konfigurations-API. Der folgende Code bindet an einen benutzerdefinierten MovieSettings
POCO und greift auf den ServiceApiKey
Eigenschaftswert zu:
var moviesConfig =
Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;
Die Movies:ConnectionString
Geheimnisse und Movies:ServiceApiKey
werden den jeweiligen Eigenschaften in MovieSettings
zugeordnet:
public class MovieSettings
{
public string ConnectionString { get; set; }
public string ServiceApiKey { get; set; }
}
Ersetzen von Zeichenfolgen durch Geheimnisse
Das Speichern von Kennwörtern im Nur-Text-Format ist unsicher. Beispielsweise kann eine in appsettings.json
gespeicherte Datenbankverbindungszeichenfolge ein Kennwort für den angegebenen Benutzer enthalten:
{
"ConnectionStrings": {
"Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
}
}
Ein sichererer Ansatz besteht darin, das Kennwort als Geheimnis zu speichern. Beispiel:
dotnet user-secrets set "DbPassword" "pass123"
Entfernen Sie das Password
Schlüssel-Wert-Paar aus der Verbindungszeichenfolge in appsettings.json
. Beispiel:
{
"ConnectionStrings": {
"Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
}
}
Der Wert des Geheimnisses kann für die -Eigenschaft eines SqlConnectionStringBuilderPassword Objekts festgelegt werden, um die Verbindungszeichenfolge abzuschließen:
public class Startup
{
private string _connection = null;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var builder = new SqlConnectionStringBuilder(
Configuration.GetConnectionString("Movies"));
builder.Password = Configuration["DbPassword"];
_connection = builder.ConnectionString;
// code omitted for brevity
}
public void Configure(IApplicationBuilder app)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync($"DB Connection: {_connection}");
});
}
}
Auflisten der Geheimnisse
Angenommen, die Datei der secrets.json
App enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Führen Sie den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets list
Die folgende Ausgabe wird angezeigt:
Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345
Im vorherigen Beispiel gibt ein Doppelpunkt in den Schlüsselnamen die Objekthierarchie in secrets.json
an.
Entfernen eines einzelnen Geheimnisses
Angenommen, die Datei der secrets.json
App enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Führen Sie den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets remove "Movies:ConnectionString"
Die Datei der secrets.json
App wurde geändert, um das Schlüssel-Wert-Paar zu entfernen, das dem MoviesConnectionString
Schlüssel zugeordnet ist:
{
"Movies": {
"ServiceApiKey": "12345"
}
}
dotnet user-secrets list
zeigt die folgende Meldung an:
Movies:ServiceApiKey = 12345
Entfernen aller Geheimnisse
Angenommen, die Datei der secrets.json
App enthält die folgenden beiden Geheimnisse:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Führen Sie den folgenden Befehl aus dem Verzeichnis aus, in dem sich die Projektdatei befindet:
dotnet user-secrets clear
Alle Benutzergeheimnisse für die App wurden aus der secrets.json
Datei gelöscht:
{}
Wenn ausgeführt wird dotnet user-secrets list
, wird die folgende Meldung angezeigt:
No secrets configured for this application.
Verwalten von Benutzergeheimnissen mit Visual Studio
Klicken Sie zum Verwalten von Benutzergeheimnissen in Visual Studio im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Benutzergeheimnisse verwalten aus:
Migrieren von Benutzergeheimnissen von ASP.NET Framework zu ASP.NET Core
Weitere Informationen finden Sie im entsprechenden GitHub-Issue.
Zusätzliche Ressourcen
- In diesem Problem finden Sie Informationen zum Zugriff auf Benutzergeheimnisse über IIS.
- Konfiguration in ASP.NET Core
- Azure Key Vault-Konfigurationsanbieter in ASP.NET Core