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.

호출 하 여 환경 변수 값을 읽는 구성 AddEnvironmentVariablesStartup 생성자: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 웹 앱을 고려해보세요.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 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

앞의 파일 경로, 대체 <user_secrets_id> 사용 하 여 합니다 UserSecretsId 에 지정 된 값을 .csproj 파일입니다.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. .NET Core SDK 2.1.300 이전 버전의 경우 도구 설치가 필요 합니다.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).

설치 합니다 Microsoft.Extensions.SecretManager.Tools ASP.NET Core 프로젝트에 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 파일에 정의 된 도구를 실행 하는 .csproj 파일의 DotNetCliToolReference 요소입니다.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.

암호 관리자 도구에는 init .NET Core SDK 3.0.100 명령을 이상.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 내의 요소를 PropertyGroup 의 합니다 .csproj 파일입니다.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.

사용자 암호를 사용 하려면 정의 UserSecretsId 내의 요소를 PropertyGroup 의 합니다 .csproj 파일입니다.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. 개발자는 일반적으로 GUID를 생성할는 UserSecretsId합니다.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. 이 제스처 추가 UserSecretsId 에 채워진 GUID를 사용 하 여 요소를 .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. 사용 합니다 --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 사용자 암호 관리 열립니다 제스처를 secrets.json 파일을 텍스트 편집기에서.Visual Studio's Manage User Secrets gesture opens a secrets.json file in the text editor. 내용을 바꿉니다 secrets.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

JSON에 파이프 하 여 비밀의 일괄 처리를 설정할 수 있습니다는 set 명령입니다.A batch of secrets can be set by piping JSON to the set command. 다음 예제에서는 input.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. CreateDefaultBuilder 호출 AddUserSecrets 때 합니다 EnvironmentNameDevelopment:CreateDefaultBuilder calls AddUserSecrets when the EnvironmentName is Development:

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

CreateDefaultBuilder 되지 호출 하 여 사용자 비밀 구성 소스를 명시적으로 추가 호출 AddUserSecretsStartup 생성자입니다.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.Extensions.Configuration.UserSecrets NuGet 패키지.Install the Microsoft.Extensions.Configuration.UserSecrets NuGet package.

호출 하 여 사용자 비밀 구성 소스를 추가 AddUserSecretsStartup 생성자: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)
    {
        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 graph 바인딩 개체 기능입니다.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:ConnectionString 하 고 Movies: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.json 지정된 된 사용자에 대 한 암호를 포함할 수 있습니다.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.json합니다.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

키 이름에 콜론 앞의 예제에서 내에서 개체 계층 구조를 나타냅니다 secrets.json합니다.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"

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

앱에 대 한 모든 사용자 암호에서 삭제 합니다 secrets.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