ASP.NET Core での開発におけるアプリ シークレットの安全な保存

提供 : Rick Anderson、Lark Larkin、Daniel Roth、Scott Addie

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

このドキュメントでは、開発用コンピューター上のアプリの機密データ ASP.NET Core管理する方法について説明します。 パスワードや他の機密データをソース コードに格納しない。 開発またはテストには、実稼働シークレットを使用する必要があります。 シークレットはアプリと一緒にデプロイする必要があります。 代わりに、環境変数や変数など、制御された手段を使用して、実稼働シークレットにアクセスAzure Key Vault。 Azure Key Vault 構成プロバイダーにより、Azure テストと運用のシークレットを格納し、保護することが可能です。

環境変数

環境変数は、コードまたはローカル構成ファイルでのアプリ シークレットの格納を回避するために使用されます。 環境変数は、以前に指定した構成ソースの構成値をオーバーライドします。

個々のユーザー ASP.NET Coreセキュリティが有効になっている Web アプリについて 考え、 既定のデータベース接続文字列は、 キー を使用してプロジェクトの appsettings.json ファイルに含まれます DefaultConnection 。 既定の接続文字列は、LocalDBモードで実行され、パスワードは必要ないユーザーの接続文字列です。 アプリのデプロイ中に DefaultConnection 、キー値を環境変数の値でオーバーライドできます。 環境変数には、機密性の高い資格情報を含む完全な接続文字列が格納される場合があります。

警告

環境変数は通常、プレーンな暗号化されていないテキストで格納されます。 マシンまたはプロセスが侵害された場合、信頼されていないパーティによって環境変数にアクセスできます。 ユーザー シークレットの漏えいを防ぐための追加の対策が必要になる場合があります。

: の区切り記号は、すべてのプラットフォームの環境変数階層キーには対応していません。 __(ダブルアンダースコア)は、

  • すべてのプラットフォームに対応しています。 たとえば、Bash: の区切り記号には対応していませんが、__ には対応しています。
  • 自動で : に置換されます。

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

Secret Manager ツールは、プロジェクトの開発中に機密データを ASP.NET Coreします。 このコンテキストでは、機密データの一部はアプリ シークレットです。 アプリ シークレットは、プロジェクト ツリーとは別の場所に格納されます。 アプリ シークレットは、特定のプロジェクトに関連付けられているか、複数のプロジェクト間で共有されます。 アプリ シークレットはソース管理にチェックインされません。

警告

シークレット マネージャー ツールでは、格納されているシークレットは暗号化されません。また、信頼されたストアとして扱う必要があります。 開発のみを目的とします。 キーと値は、ユーザー プロファイル ディレクトリの JSON 構成ファイルに格納されます。

シークレット マネージャー ツールのしくみ

Secret Manager ツールでは、値の格納場所や格納方法など、実装の詳細が非表示になります。 これらの実装の詳細を知らなくても、このツールを使用できます。 値は、ローカル コンピューターのユーザー プロファイル フォルダー内の JSON ファイルに格納されます。

ファイル システムパス:

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

前のファイル パスで、 をプロジェクト <user_secrets_id> ファイルで UserSecretsId 指定された値に置き換える必要があります。

シークレット マネージャー ツールで保存されたデータの場所や形式に依存するコードを記述しない。 これらの実装の詳細は変更される可能性があります。 たとえば、シークレット値は暗号化されませんが、将来になる可能性があります。

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

Secret Manager ツールは、ユーザー プロファイルに格納されているプロジェクト固有の構成設定で動作します。

Secret Manager ツールには init 、3.0.100 以降.NET Core SDKコマンドが含まれています。 ユーザー シークレットを使用するには、プロジェクト ディレクトリで次のコマンドを実行します。

dotnet user-secrets init

前のコマンドは、プロジェクト UserSecretsId ファイルの 内に PropertyGroup 要素を追加します。 既定では、 の内部テキスト UserSecretsId は GUID です。 内部テキストは任意ですが、プロジェクトに固有です。

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

[Visual Studio] でプロジェクトを右クリックしソリューション エクスプローラーメニューから [ユーザー シークレットの管理] を選択します。 このジェスチャは UserSecretsId 、GUID が設定された 要素をプロジェクト ファイルに追加します。

シークレットを設定する

キーとその値で構成されるアプリ シークレットを定義します。 シークレットは、プロジェクトの値に関連付 UserSecretsId けられている。 たとえば、プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

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

前の例では、コロンは、 が プロパティ Movies を持つオブジェクト リテラルであることを示 ServiceApiKey しています。

シークレット マネージャー ツールは、他のディレクトリから使用することもできます。 オプションを --project 使用して、プロジェクト ファイルが存在するファイル システム パスを指定します。 次に例を示します。

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

JSON 構造のフラット化 (Visual Studio

Visual Studioの [ユーザー シークレット の管理] ジェスチャを実行すると、テキストsecrets.js ファイル 上のファイルに対するメッセージが開きます。 の内容をsecrets.js する キーと値のペアに置き換えてください。 次に例を示します。

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

JSON 構造体は、 または を使用した変更後にフラット dotnet user-secrets remove 化されます dotnet user-secrets set 。 たとえば、 を実行すると dotnet user-secrets remove "Movies:ConnectionString" 、オブジェクト リテラルが Movies 折りたたわれます。 変更されたファイルは、次の JSON のようになります。

{
  "Movies:ServiceApiKey": "12345"
}

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

JSON を コマンドにパイプすることで、シークレットのバッチを設定 set できます。 次の例では 、input.jsの 内容に対するデータが コマンドにパイプされます set

コマンド シェルを開き、次のコマンドを実行します。

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

シークレットにアクセスする

シークレットにアクセスするには、次の手順を実行します。

  1. ユーザー シークレット構成ソースを登録する
  2. Configuration API を使用してシークレットを読み取る

ユーザー シークレット構成ソースを登録する

ユーザー シークレット構成プロバイダー は、 適切な構成ソースを .NET Configuration API に登録します

プロジェクトが を呼び出す場合、ユーザー シークレット構成ソースは開発モードで自動的に追加されます CreateDefaultBuilderCreateDefaultBuilder は、 AddUserSecrets が の場合に を EnvironmentName 呼び出します Development

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

が呼び出されていない場合は、 で を呼び出して、ユーザー CreateDefaultBuilder シークレット構成ソースを明示的に追加 AddUserSecrets します ConfigureAppConfiguration 。 次 AddUserSecrets の例に示すように、アプリが開発環境で実行されている場合にのみ を呼び出します。

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

Configuration API を使用してシークレットを読み取る

ユーザー シークレット構成ソースが登録されている場合、.NET Configuration API はシークレットを読み取る可能性があります。 コンストラクターの挿入 を使用して、.NET 構成 API にアクセスできます。 キーの読み取り例を次に示 Movies:ServiceApiKey します。

スタートアップ クラス:

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 ページ ページ モデル:

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

詳細については、「ページのスタートアップとアクセスの構成」のアクセス構成に関するページを Razor 参照してください

シークレットを POCO にマップする

オブジェクト リテラル全体を POCO (プロパティを持つ単純な .NET クラス) にマッピングすると、関連するプロパティを集計する場合に便利です。

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

前のシークレットを POCO にマップするには、.NET Configuration API のオブジェクト グラフ バインド 機能を使用 します。 次のコードは、カスタム POCO にバインド MovieSettings し、 プロパティ値に ServiceApiKey アクセスします。

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

シークレット Movies:ConnectionStringMovies:ServiceApiKey シークレットは、 のそれぞれのプロパティにマップされます MovieSettings

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

    public string ServiceApiKey { get; set; }
}

シークレットを使用した文字列置換

プレーンテキストでのパスワードの格納は安全ではありません。 たとえば、 に格納されているデータベース接続文字列には、 appsettings.json 指定したユーザーのパスワードが含まれる場合があります。

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

より安全な方法は、パスワードをシークレットとして格納する方法です。 次に例を示します。

dotnet user-secrets set "DbPassword" "pass123"

Password 接続文字列からキーと値のペアを削除します appsettings.json 。 次に例を示します。

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

シークレットの値を オブジェクトの プロパティに設定して、 SqlConnectionStringBuilder Password 接続文字列を完了できます。

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

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

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

dotnet user-secrets list

次のような出力が表示されます。

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

前の例では、キー名のコロンは、 の内のオブジェクト階層を secrets.jsします

1 つのシークレットを削除する

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

dotnet user-secrets remove "Movies:ConnectionString"

アプリのsecrets.js on ファイルが 変更され、キーに関連付けられているキーと値のペアが削除 MoviesConnectionString されました。

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

dotnet user-secrets list には、次のメッセージが表示されます。

Movies:ServiceApiKey = 12345

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

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

dotnet user-secrets clear

アプリのすべてのユーザー シークレットが、on ファイルのsecrets.js 削除 されています。

{}

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

No secrets configured for this application.

アプリケーションを使用してユーザー シークレットを管理Visual Studio

ユーザー シークレットを管理するには、Visual Studio エクスプローラーでプロジェクトを右クリックし、[ ユーザー シークレットの管理 ] を選択します

![Visual Studioシークレットの管理] を表示する](app-secrets/_static/usvs.png)

その他の技術情報

提供 : Rick Anderson、Daniel Roth、Scott Addie

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

このドキュメントでは、開発用コンピューター上のアプリの機密データ ASP.NET Core管理する方法について説明します。 パスワードや他の機密データをソース コードに格納しない。 開発またはテストには、実稼働シークレットを使用する必要があります。 シークレットはアプリと一緒にデプロイする必要があります。 代わりに、環境変数や変数など、制御された手段を使用して、実稼働シークレットにアクセスAzure Key Vault。 Azure Key Vault 構成プロバイダーにより、Azure テストと運用のシークレットを格納し、保護することが可能です。

環境変数

環境変数は、コードまたはローカル構成ファイルでのアプリ シークレットの格納を回避するために使用されます。 環境変数は、以前に指定した構成ソースの構成値をオーバーライドします。

個々のユーザー ASP.NET Coreセキュリティが有効になっている Web アプリについて 考え方を検討してください。 既定のデータベース接続文字列は、 キーを使用してプロジェクトの appsettings.json ファイルに含まれます DefaultConnection 。 既定の接続文字列は、ユーザー LocalDBで実行され、パスワードは必要ない、パスワードの場合です。 アプリのデプロイ中に DefaultConnection 、キー値を環境変数の値でオーバーライドできます。 環境変数には、機密性の高い資格情報を含む完全な接続文字列が格納される場合があります。

警告

環境変数は通常、プレーンな暗号化されていないテキストで格納されます。 マシンまたはプロセスが侵害された場合、信頼されていないパーティによって環境変数にアクセスできます。 ユーザー シークレットの漏えいを防ぐための追加の対策が必要になる場合があります。

: の区切り記号は、すべてのプラットフォームの環境変数階層キーには対応していません。 __(ダブルアンダースコア)は、

  • すべてのプラットフォームに対応しています。 たとえば、Bash: の区切り記号には対応していませんが、__ には対応しています。
  • 自動で : に置換されます。

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

Secret Manager ツールは、プロジェクトの開発中に機密データを ASP.NET Coreします。 このコンテキストでは、機密データの一部はアプリ シークレットです。 アプリ シークレットは、プロジェクト ツリーとは別の場所に格納されます。 アプリ シークレットは、特定のプロジェクトに関連付けられているか、複数のプロジェクト間で共有されます。 アプリ シークレットはソース管理にチェックインされません。

警告

シークレット マネージャー ツールでは、格納されているシークレットは暗号化されません。また、信頼されたストアとして扱う必要があります。 開発のみを目的とします。 キーと値は、ユーザー プロファイル ディレクトリの JSON 構成ファイルに格納されます。

シークレット マネージャー ツールのしくみ

Secret Manager ツールでは、値の格納場所や格納方法など、実装の詳細が非表示になります。 これらの実装の詳細を知らなくても、このツールを使用できます。 値は、ローカル コンピューターのユーザー プロファイル フォルダー内の JSON ファイルに格納されます。

ファイル システムパス:

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

前のファイル パスで、 をプロジェクト <user_secrets_id> ファイルで UserSecretsId 指定された値に置き換える必要があります。

シークレット マネージャー ツールで保存されたデータの場所や形式に依存するコードを記述しない。 これらの実装の詳細は変更される可能性があります。 たとえば、シークレット値は暗号化されませんが、将来になる可能性があります。

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

Secret Manager ツールは、ユーザー プロファイルに格納されているプロジェクト固有の構成設定で動作します。

ユーザー シークレットを使用するには、プロジェクト ファイル UserSecretsId の 内に PropertyGroup 要素を定義します。 の内部テキスト UserSecretsId は任意ですが、プロジェクトに固有です。 開発者は通常、 の GUID を生成します UserSecretsId

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

ヒント

[Visual Studio] でプロジェクトを右クリックしソリューション エクスプローラーメニューから [ユーザー シークレットの管理] を選択します。 このジェスチャは UserSecretsId 、GUID が設定された 要素をプロジェクト ファイルに追加します。

シークレットを設定する

キーとその値で構成されるアプリ シークレットを定義します。 シークレットは、プロジェクトの値に関連付 UserSecretsId けられている。 たとえば、プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

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

前の例では、コロンは、 が プロパティ Movies を持つオブジェクト リテラルであることを示 ServiceApiKey しています。

シークレット マネージャー ツールは、他のディレクトリから使用することもできます。 オプションを --project 使用して、プロジェクト ファイルが存在するファイル システム パスを指定します。 次に例を示します。

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

JSON 構造のフラット化 (Visual Studio

Visual Studioの [ユーザー シークレット の管理] ジェスチャを実行すると、テキストsecrets.js ファイル 上のファイルに対するメッセージが開きます。 の内容をsecrets.js する キーと値のペアに置き換えてください。 次に例を示します。

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

JSON 構造体は、 または を使用した変更後にフラット dotnet user-secrets remove 化されます dotnet user-secrets set 。 たとえば、 を実行すると dotnet user-secrets remove "Movies:ConnectionString" 、オブジェクト リテラルが Movies 折りたたわれます。 変更されたファイルは、次の JSON のようになります。

{
  "Movies:ServiceApiKey": "12345"
}

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

JSON を コマンドにパイプすることで、シークレットのバッチを設定 set できます。 次の例では 、input.jsの 内容に対するデータがコマンドにパイプ set されます。

コマンド シェルを開き、次のコマンドを実行します。

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

シークレットにアクセスする

Configuration API は、 ユーザー シークレットへのアクセスを提供します。

プロジェクトのターゲットが.NET Framework場合は、Microsoft.Extensions.Configインストールします。UserSecrets NuGetパッケージ。

2.0 ASP.NET Core以降では、プロジェクトが を呼び出す際に、ユーザー シークレット構成ソースが開発モードで自動的に追加されます CreateDefaultBuilderCreateDefaultBuilder は、 AddUserSecrets が の場合に を EnvironmentName 呼び出します Development

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

が呼び出されていない場合は、 コンストラクターで を呼び出して、ユーザー シークレット構成 CreateDefaultBuilder ソース AddUserSecrets を明示的に追加 Startup します。 次 AddUserSecrets の例に示すように、アプリが開発環境で実行されている場合にのみ を呼び出します。

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

ユーザー シークレットは、.NET 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}");
        });
    }
}

シークレットを POCO にマップする

オブジェクト リテラル全体を POCO (プロパティを持つ単純な .NET クラス) にマッピングすると、関連するプロパティを集計する場合に便利です。

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

前のシークレットを POCO にマップするには、.NET Configuration API のオブジェクト グラフ バインド 機能を使用 します。 次のコードは、カスタム POCO にバインド MovieSettings し、 プロパティ値に ServiceApiKey アクセスします。

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

シークレット Movies:ConnectionStringMovies:ServiceApiKey シークレットは、 のそれぞれのプロパティにマップされます MovieSettings

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

    public string ServiceApiKey { get; set; }
}

シークレットを使用した文字列置換

プレーンテキストでのパスワードの格納は安全ではありません。 たとえば、 に格納されているデータベース接続文字列には、 appsettings.json 指定したユーザーのパスワードが含まれる場合があります。

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

より安全な方法は、パスワードをシークレットとして格納する方法です。 次に例を示します。

dotnet user-secrets set "DbPassword" "pass123"

Password 接続文字列からキーと値のペアを削除します appsettings.json 。 次に例を示します。

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

シークレットの値を オブジェクトの プロパティに設定して、 SqlConnectionStringBuilder Password 接続文字列を完了できます。

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

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

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

dotnet user-secrets list

次のような出力が表示されます。

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

前の例では、キー名のコロンは、 の内のオブジェクト階層を secrets.jsします

1 つのシークレットを削除する

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

dotnet user-secrets remove "Movies:ConnectionString"

アプリのsecrets.js on ファイルが 変更され、キーに関連付けられているキーと値のペアが削除 MoviesConnectionString されました。

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

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

Movies:ServiceApiKey = 12345

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

ファイルの secrets.jsに 、次の2つのシークレットが含まれているとします。

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

プロジェクト ファイルが存在するディレクトリから次のコマンドを実行します。

dotnet user-secrets clear

アプリのすべてのユーザー シークレットが、on ファイルのsecrets.js 削除 されています。

{}

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

No secrets configured for this application.

その他の技術情報