Megosztás a következőn keresztül:


Az alkalmazás titkos kulcsainak biztonságos tárolása a fejlesztés során a ASP.NET Core-ban

Note

Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.

Warning

A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .

Rick Anderson és Kirk Larkin

Mintakód megtekintése vagy letöltése (hogyan töltsd le)

Ez a cikk azt ismerteti, hogyan kezelheti a ASP.NET Core-alkalmazások bizalmas adatait egy fejlesztői gépen. Soha ne tároljon jelszavakat vagy más bizalmas adatokat forráskódban vagy konfigurációs fájlokban. A gyártási titkokat nem szabad fejlesztésre vagy tesztelésre használni. Titkokat nem szabad üzembe helyezni az alkalmazással együtt. A gyártási titkokhoz egy kontrollált módon kell hozzáférni, mint például az Azure Key Vault. Az Azure-teszt- és éles titkos kódok az Azure Key Vault konfigurációszolgáltatójával tárolhatók és védhetők.

Az üzembe helyezett teszt- és éles alkalmazások hitelesítéséről további információt Biztonságos hitelesítési folyamatokcímű témakörben talál.

Ha felhasználói titkos kódokat szeretne használni egy .NET-konzolalkalmazásban, tekintse meg ezt a GitHub-problémát.

Környezeti változók

A környezeti változók az alkalmazáskulcsok kódban vagy helyi konfigurációs fájlokban való tárolásának elkerülésére szolgálnak. A környezeti változók felülbírálják az összes korábban megadott konfigurációs forrás konfigurációs értékeit.

Fontolja meg egy ASP.NET Core-webalkalmazást, amelyben engedélyezve van az egyéni fiókok biztonsága. Egy alapértelmezett adatbázis-kapcsolati sztring szerepel a projekt fájljában appsettings.json a kulccsal DefaultConnection. Az alapértelmezett kapcsolati sztring a LocalDB-hez tartozik, amely felhasználói módban fut, és nem igényel jelszót. Az alkalmazás üzembe helyezése során a DefaultConnection kulcsérték felülírható egy környezeti változó értékével. A környezeti változó a teljes kapcsolati sztringet bizalmas hitelesítő adatokkal tárolhatja.

Warning

A környezeti változók általában egyszerű, titkosítatlan szövegben vannak tárolva. Ha a gép vagy a folyamat sérült, a környezeti változókat nem megbízható felek érhetik el. További intézkedésekre lehet szükség a felhasználói titkos kódok felfedésének megakadályozására.

A : elválasztó nem működik a környezeti változók hierarchikus kulcsaival minden platformon. A : elválasztójel például nem elérhető a Bash-ban. A dupla aláhúzás, __, a következő:

  • Minden platform támogatja.
  • Automatikusan kicserélődik egy kettősponttal, :.

Titkos kulcskezelő

A Secret Manager eszköz bizalmas adatokat tárol az alkalmazásfejlesztés során. Ebben az összefüggésben a bizalmas adatok egy része alkalmazástitkos. Az alkalmazás titkos kulcsainak tárolása a projektfától eltérő helyen történik. Az alkalmazás titkos kódjai egy adott projekthez vannak társítva, vagy több projektben vannak megosztva. Az alkalmazás titkos kulcsai nincsenek beadva a forrásvezérlőbe.

Warning

A Secret Manager eszköz nem titkosítja a tárolt titkos kulcsokat, és nem kell megbízható tárolóként kezelni. Csak fejlesztési célokat szolgál. A kulcsok és értékek egy JSON-konfigurációs fájlban vannak tárolva a felhasználói profil könyvtárában.

A Secret Manager eszköz működése

A Secret Manager eszköz elrejti a megvalósítás részleteit, például az értékek tárolásának helyét és módját. Az eszközt anélkül használhatja, hogy ismerné ezeket a megvalósítási részleteket. Az értékek egy JSON-fájlban vannak tárolva a helyi gép felhasználói profilmappájában:

Fájlrendszer elérési útja:

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

Az előző fájl elérési útjaiban cserélje le <user_secrets_id> a UserSecretsId projektfájlban megadott értékre.

Ne írjon olyan kódot, amely a Secret Manager eszközzel mentett adatok helyétől vagy formátumától függ. Ezek a megvalósítás részletei változhatnak. A titkos értékek például nincsenek titkosítva.

Titkos kulcsok tárolásának engedélyezése

A Secret Manager eszköz a felhasználói profilban tárolt projektspecifikus konfigurációs beállításokon működik.

A parancssori felület (CLI) használata

A Secret Manager eszköz tartalmaz egy parancsot init . A felhasználói titkos kódok használatához futtassa a következő parancsot a projektkönyvtárban:

dotnet user-secrets init

Az előző parancs hozzáad egy UserSecretsId elemet a projektfájlhoz PropertyGroup . Alapértelmezés szerint a UserSecretsId belső szövege egy GUID. A belső szöveg tetszőleges, de egyedi a projektben.

A UserSecretsId MSBuild tulajdonságkonfigurációja az alkalmazás projektfájljában.

A Visual Studio használata

A Visual Studióban kattintson a jobb gombbal a projektre a Megoldáskezelőben, és válassza a Helyi menü Felhasználói titkos kulcsok kezelése parancsát . Ez a kézmozdulat egy UserSecretsId GUID azonosítóval kitöltött elemet ad hozzá a projektfájlhoz.

Ha GenerateAssemblyInfofalse

Ha a szerelvényinformációs attribútumok létrehozása le van tiltva, manuálisan adja hozzá a UserSecretsIdAttribute a(z) AssemblyInfo.cs részben. Például:

[assembly: UserSecretsId("your_user_secrets_id")]

Ha manuálisan adja hozzá az UserSecretsId attribútumot AssemblyInfo.cs, az UserSecretsId értéknek meg kell egyeznie a projektfájlban lévő értékkel.

Titkos kód beállítása

Egy kulcsból és annak értékéből álló alkalmazástitkot definiálhat. A titkos kód a projekt értékéhez UserSecretsId van társítva. Futtassa például a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

Az előző példában a kettőspont azt jelzi, hogy Movies egy objektumkonstans egy ServiceApiKey tulajdonsággal.

A Secret Manager eszköz más könyvtárakból is használható. --project A beállítással megadhatja a fájlrendszer elérési útját, ahol a projektfájl létezik. Például:

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

JSON-struktúra simítása a Visual Studióban

A Visual Studio Felhasználói titkos kódok kezelése kézmozdulata megnyit egy secrets.json fájlt a szövegszerkesztőben. A secrets.json tartalmát cserélje le a tárolandó kulcs-érték párokra. Például:

{
  "Movies": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
    "ServiceApiKey": "12345"
  }
}

A JSON-struktúra lapítva van a módosítások után a dotnet user-secrets remove vagy dotnet user-secrets set használatakor. A dotnet user-secrets remove "Movies:ConnectionString" futtatása például összecsukja az objektumliterált Movies. A módosított fájl a következő JSON-fájlhoz hasonlít:

{
  "Movies:ServiceApiKey": "12345"
}

Több titkos kulcs beállítása

A titkos kódok kötegét úgy állíthatja be, hogy a JSON-t a set parancsra irányítja. Az alábbi példában a input.json fájl tartalma a set parancsba van irányítva.

Nyisson meg egy parancshéjat, és hajtsa végre a következő parancsot:

type .\input.json | dotnet user-secrets set

Hozzáférés egy titokhoz

Egy titkos kód eléréséhez hajtsa végre a következő lépéseket:

  1. A felhasználói titkos kódok konfigurációs forrásának regisztrálása
  2. A titkos kód beolvasása a Configuration API-val

A felhasználói titkos kódok konfigurációs forrásának regisztrálása

A felhasználói titkos kódok konfigurációszolgáltatója regisztrálja a megfelelő konfigurációs forrást a .NET Configuration API-val.

ASP.NET Dotnet New vagy Visual Studio használatával létrehozott alapvető webalkalmazások a következő kódot hozzák létre:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

WebApplication.CreateBuilder inicializálja a WebApplicationBuilder osztály új példányát előre konfigurált alapértelmezett beállításokkal. Az inicializált WebApplicationBuilder (builder) alapértelmezett konfigurációt biztosít, és AddUserSecrets hív, amikor a EnvironmentNameDevelopment.

A titkos kód beolvasása a Configuration API-val

Vegye figyelembe a kulcs olvasására vonatkozó alábbi példákat Movies:ServiceApiKey :

Program.cs fájl:

var builder = WebApplication.CreateBuilder(args);
var movieApiKey = builder.Configuration["Movies:ServiceApiKey"];

var app = builder.Build();

app.MapGet("/", () => movieApiKey);

app.Run();

Razor Oldalak oldalak modellje:

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
    }
}

További információkért lásd: Konfiguráció az ASP.NET Core-ben.

Titkos kódok leképezése POCO-ra

A teljes objektum literálját POCO-ra (egyszerű .NET-osztály tulajdonságokkal) való leképezés hasznos lehet a kapcsolódó tulajdonságok összesítéséhez.

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Az előző titkos kódok POCO-ra való leképezéséhez használja a .NET Configuration API objektumgráf-kötési funkcióját. A következő kód egy egyéni MovieSettings POCO-hoz kapcsolódik, és hozzáfér a ServiceApiKey tulajdonságértékhez:

var moviesConfig = 
    Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;

A Movies:ConnectionString és Movies:ServiceApiKey titkok a MovieSettings megfelelő tulajdonságaira vannak leképezve.

public class MovieSettings
{
    public string ConnectionString { get; set; }

    public string ServiceApiKey { get; set; }
}

Sztring cseréje titkos kódokkal

A jelszavak egyszerű szövegben való tárolása nem biztonságos. Soha ne tároljon titkokat olyan konfigurációs fájlban, mint például appsettings.json, amely bekerülhet a forráskód-tárba.

A tárolt appsettings.json adatbázis-kapcsolati sztringek például nem tartalmazhatnak jelszót. Ehelyett tárolja a jelszót titokként, és futtatáskor adja meg a jelszót a kapcsolati sztringben. Például:

dotnet user-secrets set "DbPassword" "`<secret value>`"

Cserélje le az <secret value> előző példában szereplő helyőrzőt a jelszó értékére. Állítsa be a titkos kód értékét egy objektum tulajdonságán SqlConnectionStringBuilder úgy, hogy az a kapcsolati sztringben Password jelszóértékként szerepeljen:

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();

Titkos kódok listázása

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Futtassa a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets list

A következő kimenet jelenik meg:

Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345

Az előző példában a kulcsnevekben lévő kettőspont a benne lévő secrets.jsonobjektumhierarchiát jelöli.

Egyetlen titkos kód eltávolítása

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Futtassa a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets remove "Movies:ConnectionString"

Az alkalmazás secrets.json fájlját úgy módosítottuk, hogy eltávolítsuk a Movies:ConnectionString kulcshoz társított kulcs-érték párot.

{
  "Movies": {
    "ServiceApiKey": "12345"
  }
}

dotnet user-secrets list a következő üzenetet jeleníti meg:

Movies:ServiceApiKey = 12345

Az összes titkos kód eltávolítása

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Futtassa a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets clear

Az alkalmazás összes felhasználói titkos kódját törölték a secrets.json fájlból:

{}

A futtatás dotnet user-secrets list a következő üzenetet jeleníti meg:

No secrets configured for this application.

Felhasználói titkos kódok kezelése a Visual Studióval

A Visual Studióban a felhasználói titkos kódok kezeléséhez kattintson a jobb gombbal a projektre a megoldáskezelőben, és válassza a Felhasználói titkos kódok kezelése lehetőséget:

A Visual Studio a felhasználói titkos kulcsok kezelését mutatja be

Felhasználói titkos kódok migrálása ASP.NET-keretrendszerből ASP.NET Core-ba

Lásd ezt a GitHub-hibajegyet.

Felhasználói titkos kódok nem webes alkalmazásokban

A megcélzott Microsoft.NET.Sdk.Web projektek automatikusan támogatják a felhasználói titkos kulcsokat. Azoknál a projekteknél, amelyek Microsoft.NET.Sdk-et céloznak meg, például konzolalkalmazások esetében, telepítse kifejezetten a konfigurációs bővítményt és a felhasználói titkos NuGet-csomagokat.

A PowerShell használata:

Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.UserSecrets

A .NET parancssori felületének használata:

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.UserSecrets

A csomagok telepítése után inicializálja a projektet , és állítsa be a titkos kulcsokat ugyanúgy, mint egy webalkalmazás esetében. Az alábbi példa egy konzolalkalmazást mutat be, amely lekéri az "AppSecret" kulccsal beállított titkos kód értékét:

using Microsoft.Extensions.Configuration;

namespace ConsoleApp;

class Program
{
    static void Main(string[] args)
    {
        IConfigurationRoot config = new ConfigurationBuilder()
            .AddUserSecrets<Program>()
            .Build();

        Console.WriteLine(config["AppSecret"]);
    }
}

További erőforrások

Készítette: Rick Anderson, Kirk Larkin, Daniel Roth és Scott Addie

Mintakód megtekintése vagy letöltése (hogyan töltsd le)

Ez a cikk azt ismerteti, hogyan kezelheti a ASP.NET Core-alkalmazások bizalmas adatait egy fejlesztői gépen. Soha ne tároljon jelszavakat vagy más bizalmas adatokat forráskódban vagy konfigurációs fájlokban. A gyártási titkokat nem szabad fejlesztésre vagy tesztelésre használni. Titkokat nem szabad üzembe helyezni az alkalmazással együtt. A gyártási titkokhoz egy kontrollált módon kell hozzáférni, mint például az Azure Key Vault. Az Azure-teszt- és éles titkos kódok az Azure Key Vault konfigurációszolgáltatójával tárolhatók és védhetők.

A tesztelési és éles környezetek hitelesítéséről további információt a Biztonságos hitelesítési folyamatok című témakörben talál.

Környezeti változók

A környezeti változók az alkalmazáskulcsok kódban vagy helyi konfigurációs fájlokban való tárolásának elkerülésére szolgálnak. A környezeti változók felülbírálják az összes korábban megadott konfigurációs forrás konfigurációs értékeit.

Fontolja meg egy ASP.NET Core-webalkalmazást, amelyben engedélyezve van az egyéni felhasználói fiókok biztonsága. Egy alapértelmezett adatbázis-kapcsolati sztring szerepel a projekt fájljában appsettings.json a kulccsal DefaultConnection. Az alapértelmezett kapcsolati sztring a LocalDB-hez tartozik, amely felhasználói módban fut, és nem igényel jelszót. Az alkalmazás üzembe helyezése során a DefaultConnection kulcsérték felülírható egy környezeti változó értékével. A környezeti változó a teljes kapcsolati sztringet bizalmas hitelesítő adatokkal tárolhatja.

Warning

A környezeti változók általában egyszerű, titkosítatlan szövegben vannak tárolva. Ha a gép vagy a folyamat sérült, a környezeti változókat nem megbízható felek érhetik el. További intézkedésekre lehet szükség a felhasználói titkos kódok felfedésének megakadályozására.

A : elválasztó nem működik a környezeti változók hierarchikus kulcsaival minden platformon. A : elválasztójel például nem elérhető a Bash-ban. A dupla aláhúzás, __, a következő:

  • Minden platform támogatja.
  • Automatikusan kicserélődik egy kettősponttal, :.

Titkos kulcskezelő

A Secret Manager eszköz bizalmas adatokat tárol az alkalmazásfejlesztés során. Ebben az összefüggésben a bizalmas adatok egy része alkalmazástitkos. Az alkalmazás titkos kulcsainak tárolása a projektfától eltérő helyen történik. Az alkalmazás titkos kódjai egy adott projekthez vannak társítva, vagy több projektben vannak megosztva. Az alkalmazás titkos kulcsai nincsenek beadva a forrásvezérlőbe.

Warning

A Secret Manager eszköz nem titkosítja a tárolt titkos kulcsokat, és nem kell megbízható tárolóként kezelni. Csak fejlesztési célokat szolgál. A kulcsok és értékek egy JSON-konfigurációs fájlban vannak tárolva a felhasználói profil könyvtárában.

A Secret Manager eszköz működése

A Secret Manager eszköz elrejti a megvalósítás részleteit, például az értékek tárolásának helyét és módját. Az eszközt anélkül használhatja, hogy ismerné ezeket a megvalósítási részleteket. Az értékek egy JSON-fájlban vannak tárolva a helyi gép felhasználói profilmappájában:

Fájlrendszer elérési útja:

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

Az előző fájl elérési útjaiban cserélje le <user_secrets_id> a UserSecretsId projektfájlban megadott értékre.

Ne írjon olyan kódot, amely a Secret Manager eszközzel mentett adatok helyétől vagy formátumától függ. Ezek a megvalósítás részletei változhatnak. A titkos értékek például nem titkosítottak, de a jövőben is lehetnek.

Titkos kulcsok tárolásának engedélyezése

A Secret Manager eszköz a felhasználói profilban tárolt projektspecifikus konfigurációs beállításokon működik.

A Secret Manager eszköz tartalmaz egy init parancsot a .NET Core SDK 3.0.100 vagy újabb verziójában. A felhasználói titkos kódok használatához futtassa a következő parancsot a projektkönyvtárban:

dotnet user-secrets init

Az előző parancs hozzáad egy UserSecretsId elemet a projektfájlhoz PropertyGroup . Alapértelmezés szerint a UserSecretsId belső szövege egy GUID. A belső szöveg tetszőleges, de egyedi a projektben.

<PropertyGroup>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>

A Visual Studióban kattintson a jobb gombbal a projektre a Megoldáskezelőben, és válassza a Helyi menü Felhasználói titkos kulcsok kezelése parancsát . Ez a kézmozdulat egy UserSecretsId GUID azonosítóval kitöltött elemet ad hozzá a projektfájlhoz.

Titkos kód beállítása

Egy kulcsból és annak értékéből álló alkalmazástitkot definiálhat. A titkos kód a projekt értékéhez UserSecretsId van társítva. Futtassa például a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

Az előző példában a kettőspont azt jelzi, hogy Movies egy objektumkonstans egy ServiceApiKey tulajdonsággal.

A Secret Manager eszköz más könyvtárakból is használható. --project A beállítással megadhatja a fájlrendszer elérési útját, ahol a projektfájl létezik. Például:

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

JSON-struktúra simítása a Visual Studióban

A Visual Studio Felhasználói titkos kódok kezelése kézmozdulata megnyit egy secrets.json fájlt a szövegszerkesztőben. A secrets.json tartalmát cserélje le a tárolandó kulcs-érték párokra. Például:

{
  "Movies": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
    "ServiceApiKey": "12345"
  }
}

A JSON-struktúra lapítva van a módosítások után a dotnet user-secrets remove vagy dotnet user-secrets set használatakor. A dotnet user-secrets remove "Movies:ConnectionString" futtatása például összecsukja az objektumliterált Movies. A módosított fájl a következő JSON-fájlhoz hasonlít:

{
  "Movies:ServiceApiKey": "12345"
}

Több titkos kulcs beállítása

A titkos kódok kötegét úgy állíthatja be, hogy a JSON-t a set parancsra irányítja. Az alábbi példában a input.json fájl tartalma a set parancsba van irányítva.

Nyisson meg egy parancshéjat, és hajtsa végre a következő parancsot:

type .\input.json | dotnet user-secrets set

Hozzáférés egy titokhoz

Egy titkos kód eléréséhez hajtsa végre a következő lépéseket:

  1. A felhasználói titkos kódok konfigurációs forrásának regisztrálása
  2. A titkos kód beolvasása a Configuration API-val

A felhasználói titkos kódok konfigurációs forrásának regisztrálása

A felhasználói titkos kódok konfigurációszolgáltatója regisztrálja a megfelelő konfigurációs forrást a .NET Configuration API-val.

A rendszer automatikusan hozzáadja a felhasználói titkok konfigurációs forrását a Fejlesztési módban, amikor a projekt meghívja a CreateDefaultBuilder. CreateDefaultBuilder hívja AddUserSecrets , ha a EnvironmentNameDevelopment van:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Ha CreateDefaultBuilder nincs meghívva, adja hozzá a felhasználói titkok konfigurációs forrását kifejezetten azáltal, hogy meghívja a AddUserSecretsConfigureAppConfiguration parancsot. Csak akkor hívja meg AddUserSecrets, ha az alkalmazás a fejlesztési környezetben fut, ahogy az a következő példában is látható:

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();
    }
}

A titkos kód beolvasása a Configuration API-val

Ha a felhasználói titkos kódok konfigurációs forrása regisztrálva van, a .NET Configuration API elolvashatja a titkos kulcsokat. A konstruktorinjektálás a .NET Configuration API-hoz való hozzáféréshez használható. Vegye figyelembe a kulcs olvasására vonatkozó alábbi példákat Movies:ServiceApiKey :

Indítási osztály:

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 Oldalak oldalak modellje:

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
    }
}

További információ: Access konfiguráció a Startupban és Access konfiguráció a Razor Pages-ben.

Titkos kódok leképezése POCO-ra

A teljes objektum literálját POCO-ra (egyszerű .NET-osztály tulajdonságokkal) való leképezés hasznos lehet a kapcsolódó tulajdonságok összesítéséhez.

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Az előző titkos kódok POCO-ra való leképezéséhez használja a .NET Configuration API objektumgráf-kötési funkcióját. A következő kód egy egyéni MovieSettings POCO-hoz kapcsolódik, és hozzáfér a ServiceApiKey tulajdonságértékhez:

var moviesConfig = 
    Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;

A Movies:ConnectionString és Movies:ServiceApiKey titkok a MovieSettings megfelelő tulajdonságaira vannak leképezve.

public class MovieSettings
{
    public string ConnectionString { get; set; }

    public string ServiceApiKey { get; set; }
}

Sztring cseréje titkos kódokkal

A jelszavak egyszerű szövegben való tárolása nem biztonságos. Soha ne tároljon titkokat olyan konfigurációs fájlban, mint például appsettings.json, amely bekerülhet a forráskód-tárba.

A tárolt appsettings.json adatbázis-kapcsolati sztringek például nem tartalmazhatnak jelszót. Ehelyett tárolja a jelszót titokként, és futtatáskor adja meg a jelszót a kapcsolati sztringben. Például:

dotnet user-secrets set "DbPassword" "<secret value>"

Cserélje le az <secret value> előző példában szereplő helyőrzőt a jelszó értékére. Állítsa be a titkos kód értékét egy objektum tulajdonságán SqlConnectionStringBuilder úgy, hogy az a kapcsolati sztringben Password jelszóértékként szerepeljen:

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();

Titkos kódok listázása

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Futtassa a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets list

A következő kimenet jelenik meg:

Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345

Az előző példában a kulcsnevekben lévő kettőspont a benne lévő secrets.jsonobjektumhierarchiát jelöli.

Egyetlen titkos kód eltávolítása

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Futtassa a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets remove "Movies:ConnectionString"

Az alkalmazás secrets.json fájlját úgy módosítottuk, hogy eltávolítsuk a MoviesConnectionString kulcshoz társított kulcs-érték párot.

{
  "Movies": {
    "ServiceApiKey": "12345"
  }
}

dotnet user-secrets list a következő üzenetet jeleníti meg:

Movies:ServiceApiKey = 12345

Az összes titkos kód eltávolítása

Tegyük fel, hogy az alkalmazás fájlja secrets.json a következő két titkos kódot tartalmazza:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Futtassa a következő parancsot abból a könyvtárból, amelyben a projektfájl létezik:

dotnet user-secrets clear

Az alkalmazás összes felhasználói titkos kódját törölték a secrets.json fájlból:

{}

A futtatás dotnet user-secrets list a következő üzenetet jeleníti meg:

No secrets configured for this application.

Felhasználói titkos kódok kezelése a Visual Studióval

A Visual Studióban a felhasználói titkos kódok kezeléséhez kattintson a jobb gombbal a projektre a megoldáskezelőben, és válassza a Felhasználói titkos kódok kezelése lehetőséget:

A Visual Studio a felhasználói titkos kulcsok kezelését mutatja be

Felhasználói titkos kódok migrálása ASP.NET-keretrendszerből ASP.NET Core-ba

Lásd ezt a GitHub-hibajegyet.

Felhasználói titkos kódok nem webes alkalmazásokban

A megcélzott Microsoft.NET.Sdk.Web projektek automatikusan támogatják a felhasználói titkos kulcsokat. Azoknál a projekteknél, amelyek Microsoft.NET.Sdk-et céloznak meg, például konzolalkalmazások esetében, telepítse kifejezetten a konfigurációs bővítményt és a felhasználói titkos NuGet-csomagokat.

A PowerShell használata:

Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.UserSecrets

A .NET parancssori felületének használata:

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.UserSecrets

A csomagok telepítése után inicializálja a projektet , és állítsa be a titkos kulcsokat ugyanúgy, mint egy webalkalmazás esetében. Az alábbi példa egy konzolalkalmazást mutat be, amely lekéri az "AppSecret" kulccsal beállított titkos kód értékét:

using Microsoft.Extensions.Configuration;

namespace ConsoleApp;

class Program
{
    static void Main(string[] args)
    {
        IConfigurationRoot config = new ConfigurationBuilder()
            .AddUserSecrets<Program>()
            .Build();

        Console.WriteLine(config["AppSecret"]);
    }
}

További erőforrások