ASP.NET Core での開発におけるアプリシークレットの安全な保存Safe storage of app secrets in development in ASP.NET Core

Rick AndersonDaniel RothScott addieBy Rick Anderson, Daniel Roth, and Scott Addie

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

このドキュメントでは、ASP.NET Core アプリの開発時に機密データを格納および取得する方法について説明します。This document explains techniques for storing and retrieving sensitive data during the development of an ASP.NET Core app. パスワードやその他の機密データをソースコードに格納しないでください。Never store passwords or other sensitive data in source code. 運用環境のシークレットは、開発またはテストには使用しないでください。Production secrets shouldn't be used for development or test. シークレットはアプリと一緒にデプロイしないでください。Secrets shouldn't be deployed with the app. 代わりに、環境変数、Azure Key Vault などの制御された方法を使用して、運用環境でシークレットを使用できるようにする必要があります。Azure Key Vault 構成プロバイダーを使用して、Azure テストおよび運用シークレットを格納し、保護することができます。Instead, secrets should be made available in the production environment through a controlled means like environment variables, Azure Key Vault, etc. You can store and protect Azure test and production secrets with the Azure Key Vault configuration provider.

環境変数Environment variables

環境変数は、コードまたはローカル構成ファイルにアプリシークレットを格納しないようにするために使用されます。Environment variables are used to avoid storage of app secrets in code or in local configuration files. 環境変数は、以前に指定したすべての構成ソースの構成値を上書きします。Environment variables override configuration values for all previously specified configuration sources.

Startup コンストラクターで AddEnvironmentVariables を呼び出して、環境変数の値の読み取りを構成します。Configure the reading of environment variable values by calling AddEnvironmentVariables in the Startup constructor:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", 
                     optional: false, 
                     reloadOnChange: true)
        .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        builder.AddUserSecrets<Startup>();
    }

    Configuration = builder.Build();
}

個々のユーザーアカウントのセキュリティが有効になっている ASP.NET Core web アプリを考えてみましょう。Consider an ASP.NET Core web app in which Individual User Accounts security is enabled. 既定のデータベース接続文字列は、DefaultConnectionキーを持つプロジェクトのappsettingsファイルに含まれています。A default database connection string is included in the project's appsettings.json file with the key DefaultConnection. 既定の接続文字列は LocalDB 用であり、ユーザーモードで実行され、パスワードは必要ありません。The default connection string is for LocalDB, which runs in user mode and doesn't require a password. アプリの展開中に、DefaultConnection キー値を環境変数の値でオーバーライドできます。During app deployment, the DefaultConnection key value can be overridden with an environment variable's value. 環境変数には、機密性の高い資格情報を持つ完全な接続文字列が格納される場合があります。The environment variable may store the complete connection string with sensitive credentials.

警告

環境変数は通常、暗号化されていないプレーンテキストで格納されます。Environment variables are generally stored in plain, unencrypted text. コンピューターまたはプロセスが侵害された場合、信頼されていない相手から環境変数にアクセスできます。If the machine or process is compromised, environment variables can be accessed by untrusted parties. ユーザーシークレットが漏えいしないようにするための追加の手段が必要な場合があります。Additional measures to prevent disclosure of user secrets may be required.

環境変数内で階層キーを操作する場合、コロン区切り (:) がすべてのプラットフォームでは機能しない場合があります (Bash など)。When working with hierarchical keys in environment variables, a colon separator (:) may not work on all platforms (for example, Bash). 二重のアンダースコア (__) はすべてのプラットフォームでサポートされ、コロンに自動的に置換されます。A double underscore (__) is supported by all platforms and is automatically replaced by a colon.

シークレットマネージャーSecret Manager

Secret Manager ツールは、ASP.NET Core プロジェクトの開発中に機微なデータを保存します。The Secret Manager tool stores sensitive data during the development of an ASP.NET Core project. このコンテキストでは、機密データの一部がアプリシークレットになります。In this context, a piece of sensitive data is an app secret. アプリシークレットは、プロジェクトツリーとは別の場所に格納されます。App secrets are stored in a separate location from the project tree. アプリシークレットは、特定のプロジェクトに関連付けられているか、複数のプロジェクト間で共有されています。The app secrets are associated with a specific project or shared across several projects. アプリシークレットがソース管理にチェックインされていません。The app secrets aren't checked into source control.

警告

シークレットマネージャーツールは、保存されているシークレットを暗号化せず、信頼されたストアとして扱わないでください。The Secret Manager tool doesn't encrypt the stored secrets and shouldn't be treated as a trusted store. 開発目的でのみ使用されます。It's for development purposes only. キーと値は、ユーザープロファイルディレクトリの JSON 構成ファイルに格納されます。The keys and values are stored in a JSON configuration file in the user profile directory.

Secret Manager ツールの動作How the Secret Manager tool works

Secret Manager ツールは、値の格納場所や方法などの実装の詳細を抽象化します。The Secret Manager tool abstracts away the implementation details, such as where and how the values are stored. このツールは、実装の詳細を把握していなくても使用できます。You can use the tool without knowing these implementation details. 値は、ローカルコンピューター上のシステムで保護されたユーザープロファイルフォルダー内の JSON 構成ファイルに格納されます。The values are stored in a JSON configuration file in a system-protected user profile folder on the local machine:

ファイルシステムのパス:File system path:

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

上記のファイルパスで、<user_secrets_id>.csprojファイルで指定された UserSecretsId の値に置き換えます。In the preceding file paths, replace <user_secrets_id> with the UserSecretsId value specified in the .csproj file.

シークレットマネージャーツールで保存したデータの場所または形式に依存するコードは記述しないでください。Don't write code that depends on the location or format of data saved with the Secret Manager tool. これらの実装の詳細は変更される可能性があります。These implementation details may change. たとえば、シークレット値は暗号化されませんが、将来の可能性があります。For example, the secret values aren't encrypted, but could be in the future.

シークレットマネージャーツールをインストールするInstall the Secret Manager tool

Secret Manager ツールは、.NET Core SDK 2.1.300 以降の .NET Core CLI にバンドルされています。The Secret Manager tool is bundled with the .NET Core CLI in .NET Core SDK 2.1.300 or later. 2.1.300 の前にバージョンを .NET Core SDK には、ツールのインストールが必要です。For .NET Core SDK versions before 2.1.300, tool installation is necessary.

ヒント

コマンドシェルから dotnet --version を実行して、インストールされている .NET Core SDK バージョン番号を確認します。Run dotnet --version from a command shell to see the installed .NET Core SDK version number.

使用されている .NET Core SDK にツールが含まれている場合は、次のような警告が表示されます。A warning is displayed if the .NET Core SDK being used includes the tool:

The tool 'Microsoft.Extensions.SecretManager.Tools' is now included in the .NET Core SDK. Information on resolving this warning is available at (https://aka.ms/dotnetclitools-in-box).

ASP.NET Core プロジェクトにMicrosoft.Extensions.SecretManager.Tools NuGet パッケージをインストールします。Install the Microsoft.Extensions.SecretManager.Tools NuGet package in your ASP.NET Core project. 例:For example:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <UserSecretsId>1242d6d6-9df3-4031-b031-d9b27d13c25a</UserSecretsId>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" 
                      Version="1.1.6" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" 
                      Version="1.1.2" />
    <PackageReference Include="System.Data.SqlClient" 
                      Version="4.5.0" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" 
                            Version="1.0.1" />
  </ItemGroup>
</Project>

コマンドシェルで次のコマンドを実行して、ツールのインストールを検証します。Execute the following command in a command shell to validate the tool installation:

dotnet user-secrets -h

Secret Manager ツールには、使用法、オプション、およびコマンドヘルプのサンプルが表示されます。The Secret Manager tool displays sample usage, options, and command help:

Usage: dotnet user-secrets [options] [command]

Options:
  -?|-h|--help                        Show help information
  --version                           Show version information
  -v|--verbose                        Show verbose output
  -p|--project <PROJECT>              Path to project. Defaults to searching the current directory.
  -c|--configuration <CONFIGURATION>  The project configuration to use. Defaults to 'Debug'.
  --id                                The user secret ID to use.

Commands:
  clear   Deletes all the application secrets
  list    Lists all the application secrets
  remove  Removes the specified user secret
  set     Sets the user secret to the specified value

Use "dotnet user-secrets [command] --help" for more information about a command.

注意

.Csprojファイルの DotNetCliToolReference 要素で定義されているツールを実行するには、 .csprojファイルと同じディレクトリに存在する必要があります。You must be in the same directory as the .csproj file to run tools defined in the .csproj file's DotNetCliToolReference elements.

シークレットストレージを有効にするEnable secret storage

Secret Manager ツールは、ユーザープロファイルに格納されているプロジェクト固有の構成設定を操作します。The Secret Manager tool operates on project-specific configuration settings stored in your user profile.

Secret Manager ツールには、.NET Core SDK 3.0.100 以降の init コマンドが含まれています。The Secret Manager tool includes an init command in .NET Core SDK 3.0.100 or later. ユーザーシークレットを使用するには、プロジェクトディレクトリで次のコマンドを実行します。To use user secrets, run the following command in the project directory:

dotnet user-secrets init

上記のコマンドは、 .csprojファイルの PropertyGroup 内に UserSecretsId 要素を追加します。The preceding command adds a UserSecretsId element within a PropertyGroup of the .csproj file. 既定では UserSecretsId の内部テキストは GUID です。By default, the inner text of UserSecretsId is a GUID. 内部テキストは任意ですが、プロジェクトに固有です。The inner text is arbitrary, but is unique to the project.

ユーザーシークレットを使用するには、 .csprojファイルの PropertyGroup 内に UserSecretsId 要素を定義します。To use user secrets, define a UserSecretsId element within a PropertyGroup of the .csproj file. UserSecretsId の内部テキストは任意ですが、プロジェクトに固有です。The inner text of UserSecretsId is arbitrary, but is unique to the project. 開発者は通常、UserSecretsIdの GUID を生成します。Developers typically generate a GUID for the UserSecretsId.

<PropertyGroup>
  <TargetFramework>netcoreapp2.1</TargetFramework>
  <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>
<PropertyGroup>
  <TargetFramework>netcoreapp1.1</TargetFramework>
  <UserSecretsId>1242d6d6-9df3-4031-b031-d9b27d13c25a</UserSecretsId>
</PropertyGroup>

ヒント

Visual Studio で、ソリューションエクスプローラーでプロジェクトを右クリックし、コンテキストメニューから [ユーザーシークレットの管理] を選択します。In Visual Studio, right-click the project in Solution Explorer, and select Manage User Secrets from the context menu. このジェスチャは、GUID で設定された UserSecretsId 要素を .csproj ファイルに追加しますThis gesture adds a UserSecretsId element, populated with a GUID, to the .csproj file.

シークレットを設定するSet a secret

キーとその値で構成されるアプリシークレットを定義します。Define an app secret consisting of a key and its value. シークレットは、プロジェクトの UserSecretsId 値に関連付けられます。The secret is associated with the project's UserSecretsId value. たとえば、 .csprojファイルが存在するディレクトリから次のコマンドを実行します。For example, run the following command from the directory in which the .csproj file exists:

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

前の例では、コロンは、MoviesServiceApiKey プロパティを持つオブジェクトリテラルであることを示しています。In the preceding example, the colon denotes that Movies is an object literal with a ServiceApiKey property.

シークレットマネージャーツールは、他のディレクトリからも使用できます。The Secret Manager tool can be used from other directories too. --project オプションを使用して、 .csprojファイルが存在するファイルシステムパスを指定します。Use the --project option to supply the file system path at which the .csproj file exists. 例:For example:

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

Visual Studio での JSON 構造のフラット化JSON structure flattening in Visual Studio

Visual Studio の [ユーザーシークレットの管理] ジェスチャは、テキストエディターでシークレットの jsonファイルを開きます。Visual Studio's Manage User Secrets gesture opens a secrets.json file in the text editor. シークレットの内容を、格納されるキーと値のペアで置き換えます。Replace the contents of secrets.json with the key-value pairs to be stored. 例:For example:

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

JSON 構造体は、dotnet user-secrets remove または dotnet user-secrets setを使用した変更後にフラット化されます。The JSON structure is flattened after modifications via dotnet user-secrets remove or dotnet user-secrets set. たとえば、dotnet user-secrets remove "Movies:ConnectionString" を実行すると、Movies オブジェクトリテラルが折りたたまれます。For example, running dotnet user-secrets remove "Movies:ConnectionString" collapses the Movies object literal. 変更後のファイルは次のようになります。The modified file resembles the following:

{
  "Movies:ServiceApiKey": "12345"
}

複数のシークレットを設定するSet multiple secrets

シークレットのバッチは、JSON を set コマンドにパイプすることによって設定できます。A batch of secrets can be set by piping JSON to the set command. 次の例では、入力の jsonファイルの内容をパイプ処理して set コマンドを実行します。In the following example, the input.json file's contents are piped to the set command.

コマンドシェルを開き、次のコマンドを実行します。Open a command shell, and execute the following command:

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

シークレットにアクセスします。Access a secret

ASP.NET Core 構成 APIは、シークレットマネージャーのシークレットへのアクセスを提供します。The ASP.NET Core Configuration API provides access to Secret Manager secrets.

プロジェクトが .NET Framework 対象である場合は、 Microsoft.Extensions.Configuration.UserSecrets NuGet パッケージをインストールします。If your project targets .NET Framework, install the Microsoft.Extensions.Configuration.UserSecrets NuGet package.

ASP.NET Core 2.0 以降では、プロジェクトが CreateDefaultBuilder を呼び出して、構成済みの既定値でホストの新しいインスタンスを初期化すると、開発モードでユーザーシークレットの構成ソースが自動的に追加されます。In ASP.NET Core 2.0 or later, the user secrets configuration source is automatically added in development mode when the project calls CreateDefaultBuilder to initialize a new instance of the host with preconfigured defaults. EnvironmentNameDevelopmentされている場合、AddUserSecrets 呼び出し CreateDefaultBuilder ます。CreateDefaultBuilder calls AddUserSecrets when the EnvironmentName is Development:

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

CreateDefaultBuilder が呼び出されない場合は、Startup コンストラクターで AddUserSecrets を呼び出すことによって、ユーザーシークレット構成ソースを明示的に追加します。When CreateDefaultBuilder isn't called, add the user secrets configuration source explicitly by calling AddUserSecrets in the Startup constructor. 次の例に示すように、アプリが開発環境で実行されている場合にのみ AddUserSecrets を呼び出します。Call AddUserSecrets only when the app runs in the Development environment, as shown in the following example:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", 
                     optional: false, 
                     reloadOnChange: true)
        .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        builder.AddUserSecrets<Startup>();
    }

    Configuration = builder.Build();
}
public Startup(IWebHostEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", 
                     optional: false, 
                     reloadOnChange: true)
        .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        builder.AddUserSecrets<Startup>();
    }

    Configuration = builder.Build();
}

Microsoft.Extensions.Configuration.UserSecrets NuGet パッケージをインストールします。Install the Microsoft.Extensions.Configuration.UserSecrets NuGet package.

Startup コンストラクターで AddUserSecrets の呼び出しを使用して、ユーザーシークレット構成ソースを追加します。Add the user secrets configuration source with a call to AddUserSecrets in the Startup constructor:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", 
                     optional: false, 
                     reloadOnChange: true)
        .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        builder.AddUserSecrets<Startup>();
    }

    Configuration = builder.Build();
}

ユーザーシークレットは、Configuration API を使用して取得できます。User secrets can be retrieved via the Configuration API:

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}");
        });
    }
}
public class Startup
{
    private string _moviesApiKey = null;
    
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", 
                         optional: false, 
                         reloadOnChange: true)
            .AddEnvironmentVariables();

        if (env.IsDevelopment())
        {
            builder.AddUserSecrets<Startup>();
        }

        Configuration = builder.Build();
    }

    public IConfigurationRoot 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}");
        });
    }
}

シークレットを POCO にマップするMap secrets to a POCO

オブジェクトリテラル全体を POCO (プロパティを持つ単純な .NET クラス) にマップすると、関連するプロパティを集計するのに役立ちます。Mapping an entire object literal to a POCO (a simple .NET class with properties) is useful for aggregating related properties.

アプリの想定secrets.jsonファイルには、次の 2 つのシークレットが含まれています。Assume the app's secrets.json file contains the following two secrets:

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

上記のシークレットを POCO にマップするには、Configuration API のオブジェクトグラフバインド機能を使用します。To map the preceding secrets to a POCO, use the Configuration API's object graph binding feature. 次のコードは、カスタム MovieSettings POCO にバインドし、ServiceApiKey プロパティ値にアクセスします。The following code binds to a custom MovieSettings POCO and accesses the ServiceApiKey property value:

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

Movies:ConnectionStringMovies:ServiceApiKey シークレットは MovieSettingsの各プロパティにマップされます。The Movies:ConnectionString and Movies:ServiceApiKey secrets are mapped to the respective properties in MovieSettings:

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

    public string ServiceApiKey { get; set; }
}

シークレットを使用した文字列の置換String replacement with secrets

プレーンテキストでのパスワードの保存は安全ではありません。Storing passwords in plain text is insecure. たとえば、 appsettingsに格納されているデータベース接続文字列には、指定されたユーザーのパスワードを含めることができます。For example, a database connection string stored in appsettings.json may include a password for the specified user:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
  }
}

より安全な方法は、パスワードをシークレットとして保存することです。A more secure approach is to store the password as a secret. 例:For example:

dotnet user-secrets set "DbPassword" "pass123"

Password キーと値のペアを、 appsettingsの接続文字列から削除します。Remove the Password key-value pair from the connection string in appsettings.json. 例:For example:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
  }
}

シークレットの値を SqlConnectionStringBuilder オブジェクトの Password プロパティに設定して、接続文字列を完成させることができます。The secret's value can be set on a SqlConnectionStringBuilder object's Password property to complete the connection string:

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

    public void Configure(IApplicationBuilder app)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync($"DB Connection: {_connection}");
        });
    }
}
public class Startup
{
    private string _connection = null;
    
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json",
                         optional: false,
                         reloadOnChange: true)
            .AddEnvironmentVariables();

        if (env.IsDevelopment())
        {
            builder.AddUserSecrets<Startup>();
        }

        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        var builder = new SqlConnectionStringBuilder(
            Configuration.GetConnectionString("Movies"));
        builder.Password = Configuration["DbPassword"];
        _connection = builder.ConnectionString;
    }

    public void Configure(IApplicationBuilder app)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync($"DB Connection: {_connection}");
        });
    }
}

シークレットを一覧表示するList the secrets

アプリの想定secrets.jsonファイルには、次の 2 つのシークレットが含まれています。Assume the app's secrets.json file contains the following two secrets:

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

.Csprojファイルが存在するディレクトリから、次のコマンドを実行します。Run the following command from the directory in which the .csproj file exists:

dotnet user-secrets list

次の出力が表示されます。The following output appears:

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

前の例では、キー名のコロンは、 json内のオブジェクト階層を表しています。In the preceding example, a colon in the key names denotes the object hierarchy within secrets.json.

1つのシークレットを削除するRemove a single secret

アプリの想定secrets.jsonファイルには、次の 2 つのシークレットが含まれています。Assume the app's secrets.json file contains the following two secrets:

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

.Csprojファイルが存在するディレクトリから、次のコマンドを実行します。Run the following command from the directory in which the .csproj file exists:

dotnet user-secrets remove "Movies:ConnectionString"

アプリのシークレットの jsonファイルが変更され、MoviesConnectionString キーに関連付けられているキーと値のペアが削除されました。The app's secrets.json file was modified to remove the key-value pair associated with the MoviesConnectionString key:

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

dotnet user-secrets list を実行すると、次のメッセージが表示されます。Running dotnet user-secrets list displays the following message:

Movies:ServiceApiKey = 12345

すべてのシークレットを削除するRemove all secrets

アプリの想定secrets.jsonファイルには、次の 2 つのシークレットが含まれています。Assume the app's secrets.json file contains the following two secrets:

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

.Csprojファイルが存在するディレクトリから、次のコマンドを実行します。Run the following command from the directory in which the .csproj file exists:

dotnet user-secrets clear

アプリのすべてのユーザーシークレットが、シークレットの jsonファイルから削除されています。All user secrets for the app have been deleted from the secrets.json file:

{}

dotnet user-secrets list を実行すると、次のメッセージが表示されます。Running dotnet user-secrets list displays the following message:

No secrets configured for this application.

その他の技術情報Additional resources