ASP.NET Core 개발 시 앱 비밀의 안전한 저장Safe storage of app secrets in development in ASP.NET Core

작성자: Rick Anderson, 김 Roth, 및 Scott 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. Azure Key Vault 구성 제공자로 Azure 테스트 및 프로덕션 암호를 저장하고 보호할 수 있습니다.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.

생성자에서를 호출 AddEnvironmentVariables 하 여 환경 변수 값에 대 한 읽기를 구성 합니다. StartupConfigure 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 웹 앱을 고려해보세요.Consider an ASP.NET Core web app in which Individual User Accounts security is enabled. 기본 데이터베이스 연결 문자열이 프로젝트의 appsettings.json 파일의 DefaultConnection 키에 포함되어 있습니다.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

암호 관리자 도구는 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.

비밀 관리자 도구의 작동 원리How the Secret Manager tool works

비밀 관리자 도구는 값이 저장 되는 위치 및 방법과 같은 구현 세부 정보를 추출 합니다.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

위의 파일 경로에서를 .csproj 파일 <user_secrets_id> 에 지정 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

암호 관리자 도구는 .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

비밀 관리자 도구는 예제 사용법, 옵션 및 명령 도움말을 표시 합니다.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

비밀 관리자 도구는 사용자 프로필에 저장 된 프로젝트별 구성 설정에 대해 작동 합니다.The Secret Manager tool operates on project-specific configuration settings stored in your user profile.

암호 관리자 도구는 .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

이전 명령은 UserSecretsId .csproj 파일 PropertyGroup 의 내에 요소를 추가 합니다.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 파일 UserSecretsId PropertyGroup 의 내에서 요소를 정의 합니다.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. 개발자는 일반적으로에 대 한 UserSecretsIdGUID를 생성 합니다.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"

앞의 예제에서 콜론은가 Movies ServiceApiKey 속성을 사용 하는 개체 리터럴이어야 함을 나타냅니다.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. 옵션을 사용 하 여 .csproj 파일이 있는 파일 시스템 경로를 제공 합니다. --projectUse 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. 비밀. json 의 내용을 저장할 키-값 쌍으로 바꿉니다.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

암호 일괄 처리는 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 확장명이 . n e t.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. CreateDefaultBuilderAddUserSecrets EnvironmentName 인 경우Development를 호출 합니다.CreateDefaultBuilder calls AddUserSecrets when the EnvironmentName is Development:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .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();
}

Microsoft 확장명이 구성 된 NuGet 패키지를 설치 합니다.Install the Microsoft.Extensions.Configuration.UserSecrets NuGet package.

생성자에서에 대 AddUserSecrets 한 호출을 사용 하 여 사용자 비밀 구성 소스를 추가 합니다. StartupAdd 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();
}

API를 Configuration 통해 사용자 암호를 검색할 수 있습니다.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)
    {
        var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null";
        app.Run(async (context) =>
        {
            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)
    {
        var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null";
        app.Run(async (context) =>
        {
            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 파일에 다음 두 암호를 포함 합니다.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;

및 암호는 의MovieSettings해당 속성에 매핑됩니다. Movies:ServiceApiKey Movies:ConnectionStringThe 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"

Appsettings의 Password 연결 문자열에서 키-값 쌍을 제거합니다.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 파일에 다음 두 암호를 포함 합니다.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

앞의 예제에서 키 이름의 콜론은 비밀이포함 된 개체 계층 구조를 나타냅니다.In the preceding example, a colon in the key names denotes the object hierarchy within secrets.json.

단일 비밀 제거Remove a single secret

앱의 가정 secrets.json 파일에 다음 두 암호를 포함 합니다.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"

MoviesConnectionString 키와 연결 된 키-값 쌍을 제거 하기 위해 앱의 비밀. json 파일이 수정 되었습니다.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 파일에 다음 두 암호를 포함 합니다.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