Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Por Rick Anderson e Kirk Larkin
Visualizar ou descarregar amostra de código (como descarregar)
Este artigo explica como gerenciar dados confidenciais para um aplicativo ASP.NET Core em uma máquina de desenvolvimento. Nunca armazene senhas ou outros dados confidenciais em código-fonte ou arquivos de configuração. Os segredos de produção não devem ser usados para desenvolvimento ou teste. Os segredos não devem ser implantados com o aplicativo. Os segredos de produção devem ser acessados por meio de um meio controlado, como o Azure Key Vault. Os segredos de teste e produção do Azure podem ser armazenados e protegidos com o provedor de configuração do Azure Key Vault.
Para obter mais informações sobre autenticação para aplicativos de teste e produção implantados, consulte Fluxos de autenticação seguros.
Para usar segredos de usuário em um aplicativo de console .NET, consulte este problema do GitHub.
Variáveis de ambiente
As variáveis de ambiente são usadas para evitar o armazenamento de segredos do aplicativo no código ou em arquivos de configuração local. As variáveis de ambiente substituem os valores de configuração para todas as fontes de configuração especificadas anteriormente.
Considere um aplicativo Web ASP.NET Core no qual a segurança de Contas Individuais esteja ativada. Uma cadeia de conexão de banco de dados padrão está incluída no arquivo do projeto com a chave appsettings.json
. A cadeia de conexão padrão é para LocalDB, que é executado no modo de usuário e não requer uma senha. Durante a implantação do aplicativo, o valor da DefaultConnection
chave pode ser substituído pelo valor de uma variável de ambiente. A variável de ambiente pode armazenar a cadeia de conexão completa com credenciais confidenciais.
Advertência
As variáveis de ambiente geralmente são armazenadas em texto simples e não criptografado. Se a máquina ou o processo estiver comprometido, as variáveis de ambiente podem ser acessadas por partes não confiáveis. Podem ser necessárias medidas adicionais para evitar a divulgação de segredos de utilizador.
O separador :
não funciona com chaves hierárquicas de variáveis de ambiente em todas as plataformas. Por exemplo, o separador :
não é suportado pelo Bash. O duplo sublinhado, __
, é:
- Suportado por todas as plataformas.
- Substituído automaticamente por dois pontos,
:
.
Gestor Secreto
A ferramenta Secret Manager armazena dados confidenciais durante o desenvolvimento do aplicativo. Nesse contexto, um dado sensível é um segredo do aplicativo. Os segredos do aplicativo são armazenados em um local separado da árvore do projeto. Os segredos do aplicativo são associados a um projeto específico ou compartilhados entre vários projetos. Os segredos do aplicativo não são verificados no controle do código-fonte.
Advertência
A ferramenta Secret Manager não criptografa os segredos armazenados e não deve ser tratada como um armazenamento confiável. É apenas para fins de desenvolvimento. As chaves e os valores são armazenados em um arquivo de configuração JSON no diretório de perfil do usuário.
Como funciona a ferramenta Secret Manager
A ferramenta Secret Manager oculta detalhes de implementação, como onde e como os valores são armazenados. Você pode usar a ferramenta sem conhecer esses detalhes de implementação. Os valores são armazenados em um arquivo JSON na pasta de perfil de usuário da máquina local:
Caminho do sistema de arquivos:
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
Nos caminhos de arquivo anteriores, substitua <user_secrets_id>
pelo valor UserSecretsId
especificado no arquivo de projeto.
Não escreva código que dependa da localização ou do formato dos dados guardados com a ferramenta Secret Manager. Esses detalhes de implementação podem mudar. Por exemplo, os valores secretos não são criptografados.
Ativar armazenamento secreto
A ferramenta Secret Manager opera em definições de configuração específicas do projeto armazenadas em seu perfil de usuário.
Utilizar a CLI
A ferramenta Secret Manager inclui um init
comando. Para usar segredos de usuário, execute o seguinte comando no diretório do projeto:
dotnet user-secrets init
O comando anterior adiciona um UserSecretsId
elemento dentro de um PropertyGroup
do arquivo de projeto. Por padrão, o texto interno do UserSecretsId
é um GUID. O texto interno é arbitrário, mas é exclusivo do projeto.
Utilize o Visual Studio
No Visual Studio, clique com o botão direito do mouse no projeto no Gerenciador de Soluções e selecione Gerenciar Segredos do Usuário no menu de contexto. Esse gesto adiciona um UserSecretsId
elemento, preenchido com um GUID, ao arquivo de projeto.
Se GenerateAssemblyInfo
for false
Se a geração de atributos de informações de assembly estiver desativada, adicione manualmente o UserSecretsIdAttribute em AssemblyInfo.cs
. Por exemplo:
[assembly: UserSecretsId("your_user_secrets_id")]
Ao adicionar manualmente o UserSecretsId
atributo ao AssemblyInfo.cs
, o UserSecretsId
valor deve corresponder ao valor no arquivo de projeto.
Defina um segredo
Defina um segredo de aplicativo que consiste em uma chave e seu valor. O segredo está associado ao valor UserSecretsId
do projeto. Por exemplo, execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets set "Movies:ServiceApiKey" "12345"
No exemplo anterior, os dois pontos denotam que Movies
é um objeto literal com a propriedade ServiceApiKey
.
A ferramenta Secret Manager também pode ser usada em outros diretórios. Use a --project
opção para fornecer o caminho do sistema de arquivos no qual o arquivo de projeto existe. Por exemplo:
dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"
Achatamento da estrutura JSON no Visual Studio
O gesto Gerenciar segredos de usuário do Visual Studio abre um secrets.json
arquivo no editor de texto. Substitua o conteúdo de secrets.json
pelos pares chave-valor a serem armazenados. Por exemplo:
{
"Movies": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"ServiceApiKey": "12345"
}
}
A estrutura JSON é achatada após modificações via dotnet user-secrets remove
ou dotnet user-secrets set
. Por exemplo, a execução dotnet user-secrets remove "Movies:ConnectionString"
recolhe o Movies
objeto literal. O ficheiro modificado é semelhante ao seguinte JSON:
{
"Movies:ServiceApiKey": "12345"
}
Definir vários segredos
Um lote de segredos pode ser definido canalizando JSON para o set
comando. No exemplo a seguir, o input.json
conteúdo do arquivo é canalizado para o set
comando.
Abra um shell de comando e execute o seguinte comando:
type .\input.json | dotnet user-secrets set
Aceda a um segredo
Para acessar um segredo, conclua as seguintes etapas:
- Registrar a fonte de configuração de segredos do usuário
- Leia o segredo através da API de configuração
Registrar a fonte de configuração de segredos do usuário
O provedor de configuração de segredos do utilizador regista a fonte de configuração apropriada na API de Configuração do .NET.
ASP.NET principais aplicativos Web criados com dotnet new ou Visual Studio geram o seguinte código:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
WebApplication.CreateBuilder inicializa uma nova instância da classe WebApplicationBuilder com padrões pré-configurados. O inicializado WebApplicationBuilder
(builder
) fornece configuração padrão e chama AddUserSecrets quando o EnvironmentName é Development:
Leia o segredo através da API de configuração
Considere os seguintes exemplos de leitura da Movies:ServiceApiKey
chave:
Program.cs ficheiro:
var builder = WebApplication.CreateBuilder(args);
var movieApiKey = builder.Configuration["Movies:ServiceApiKey"];
var app = builder.Build();
app.MapGet("/", () => movieApiKey);
app.Run();
Razor Modelo de página de páginas:
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
}
}
Para obter mais informações, consulte Configuração no ASP.NET Core.
Mapeie segredos para um POCO
O mapeamento de um objeto inteiro literal para um POCO (uma classe .NET simples com propriedades) é útil para agregar propriedades relacionadas.
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Para mapear os segredos precedentes para um POCO, use o recurso de vinculação de gráfico de objetos da API de Configuração do .NET. O código a seguir liga-se a um POCO personalizado MovieSettings
e acede ao valor da propriedade ServiceApiKey
.
var moviesConfig =
Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;
Os segredos Movies:ConnectionString
e Movies:ServiceApiKey
são mapeados para as respetivas propriedades em MovieSettings
:
public class MovieSettings
{
public string ConnectionString { get; set; }
public string ServiceApiKey { get; set; }
}
Substituição de strings com segredos
Armazenar senhas em texto sem formatação é inseguro. Nunca armazene segredos num ficheiro de configuração como appsettings.json
, que pode ser verificado num repositório de código-fonte.
Por exemplo, uma cadeia de conexão de banco de dados armazenada em appsettings.json
não deve incluir uma senha. Em vez disso, armazene a senha como um segredo e inclua a senha na cadeia de conexão em tempo de execução. Por exemplo:
dotnet user-secrets set "DbPassword" "`<secret value>`"
Substitua o marcador de posição <secret value>
no exemplo anterior pelo valor da senha. Defina o valor do segredo na propriedade SqlConnectionStringBuilder de um objeto Password para incluí-lo como o valor da senha na cadeia de ligação.
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();
Listar os segredos
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets list
A seguinte saída é exibida:
Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345
No exemplo anterior, dois pontos nos nomes das chaves denotam a hierarquia de objetos dentro do secrets.json
.
Remover um único segredo
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets remove "Movies:ConnectionString"
O arquivo do secrets.json
aplicativo foi modificado para remover o par chave-valor associado à Movies:ConnectionString
chave:
{
"Movies": {
"ServiceApiKey": "12345"
}
}
dotnet user-secrets list
Exibe a seguinte mensagem:
Movies:ServiceApiKey = 12345
Remover todos os segredos
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets clear
Todos os segredos de usuário do aplicativo foram excluídos do secrets.json
arquivo:
{}
A execução dotnet user-secrets list
exibe a seguinte mensagem:
No secrets configured for this application.
Gerenciar segredos de usuário com o Visual Studio
Para gerenciar segredos de usuário no Visual Studio, clique com o botão direito do mouse no projeto no gerenciador de soluções e selecione Gerenciar segredos de usuário:
Migrando segredos de usuário do ASP.NET Framework para o ASP.NET Core
Veja o sobre este problema do GitHub.
Segredos de utilizador em aplicações não Web
Projetos que visam Microsoft.NET.Sdk.Web
incluem automaticamente o suporte para segredos de utilizador. Para projetos destinados a Microsoft.NET.Sdk
, como aplicativos de console, instale explicitamente os pacotes NuGet de extensão de configuração e segredos de utilizador.
Utilizando o PowerShell:
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.UserSecrets
Usando a CLI do .NET:
dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.UserSecrets
Depois que os pacotes estiverem instalados, inicialize o projeto e defina segredos da mesma forma que para um aplicativo Web. O exemplo a seguir mostra um aplicativo de console que recupera o valor de um segredo que foi definido com a chave "AppSecret":
using Microsoft.Extensions.Configuration;
namespace ConsoleApp;
class Program
{
static void Main(string[] args)
{
IConfigurationRoot config = new ConfigurationBuilder()
.AddUserSecrets<Program>()
.Build();
Console.WriteLine(config["AppSecret"]);
}
}
Recursos adicionais
- Consulte este problema e este problema para obter informações sobre como acessar segredos de usuário do IIS.
- Configuração no ASP.NET Core
- Provedor de configuração do Azure Key Vault no ASP.NET Core
Por Rick Anderson, Kirk Larkin, Daniel Roth e Scott Addie
Visualizar ou descarregar amostra de código (como descarregar)
Este artigo explica como gerenciar dados confidenciais para um aplicativo ASP.NET Core em uma máquina de desenvolvimento. Nunca armazene senhas ou outros dados confidenciais em código-fonte ou arquivos de configuração. Os segredos de produção não devem ser usados para desenvolvimento ou teste. Os segredos não devem ser implantados com o aplicativo. Os segredos de produção devem ser acessados por meio de um meio controlado, como o Azure Key Vault. Os segredos de teste e produção do Azure podem ser armazenados e protegidos com o provedor de configuração do Azure Key Vault.
Para obter mais informações sobre autenticação para ambientes de teste e produção, consulte Fluxos de autenticação seguros.
Variáveis de ambiente
As variáveis de ambiente são usadas para evitar o armazenamento de segredos do aplicativo no código ou em arquivos de configuração local. As variáveis de ambiente substituem os valores de configuração para todas as fontes de configuração especificadas anteriormente.
Considere um aplicativo Web ASP.NET Core no qual a segurança de Contas de Usuário Individuais esteja habilitada. Uma cadeia de conexão de banco de dados padrão está incluída no arquivo do projeto com a chave appsettings.json
. A cadeia de conexão padrão é para LocalDB, que é executado no modo de usuário e não requer uma senha. Durante a implantação do aplicativo, o valor da DefaultConnection
chave pode ser substituído pelo valor de uma variável de ambiente. A variável de ambiente pode armazenar a cadeia de conexão completa com credenciais confidenciais.
Advertência
As variáveis de ambiente geralmente são armazenadas em texto simples e não criptografado. Se a máquina ou o processo estiver comprometido, as variáveis de ambiente podem ser acessadas por partes não confiáveis. Podem ser necessárias medidas adicionais para evitar a divulgação de segredos de utilizador.
O separador :
não funciona com chaves hierárquicas de variáveis de ambiente em todas as plataformas. Por exemplo, o separador :
não é suportado pelo Bash. O duplo sublinhado, __
, é:
- Suportado por todas as plataformas.
- Substituído automaticamente por dois pontos,
:
.
Gestor Secreto
A ferramenta Secret Manager armazena dados confidenciais durante o desenvolvimento do aplicativo. Nesse contexto, um dado sensível é um segredo do aplicativo. Os segredos do aplicativo são armazenados em um local separado da árvore do projeto. Os segredos do aplicativo são associados a um projeto específico ou compartilhados entre vários projetos. Os segredos do aplicativo não são verificados no controle do código-fonte.
Advertência
A ferramenta Secret Manager não criptografa os segredos armazenados e não deve ser tratada como um armazenamento confiável. É apenas para fins de desenvolvimento. As chaves e os valores são armazenados em um arquivo de configuração JSON no diretório de perfil do usuário.
Como funciona a ferramenta Secret Manager
A ferramenta Secret Manager oculta detalhes de implementação, como onde e como os valores são armazenados. Você pode usar a ferramenta sem conhecer esses detalhes de implementação. Os valores são armazenados em um arquivo JSON na pasta de perfil de usuário da máquina local:
Caminho do sistema de arquivos:
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
Nos caminhos de arquivo anteriores, substitua <user_secrets_id>
pelo valor UserSecretsId
especificado no arquivo de projeto.
Não escreva código que dependa da localização ou do formato dos dados guardados com a ferramenta Secret Manager. Esses detalhes de implementação podem mudar. Por exemplo, os valores secretos não são criptografados, mas podem ser no futuro.
Ativar armazenamento secreto
A ferramenta Secret Manager opera em definições de configuração específicas do projeto armazenadas em seu perfil de usuário.
A ferramenta Secret Manager inclui um init
comando no .NET Core SDK 3.0.100 ou posterior. Para usar segredos de usuário, execute o seguinte comando no diretório do projeto:
dotnet user-secrets init
O comando anterior adiciona um UserSecretsId
elemento dentro de um PropertyGroup
do arquivo de projeto. Por padrão, o texto interno do UserSecretsId
é um GUID. O texto interno é arbitrário, mas é exclusivo do projeto.
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>
No Visual Studio, clique com o botão direito do mouse no projeto no Gerenciador de Soluções e selecione Gerenciar Segredos do Usuário no menu de contexto. Esse gesto adiciona um UserSecretsId
elemento, preenchido com um GUID, ao arquivo de projeto.
Defina um segredo
Defina um segredo de aplicativo que consiste em uma chave e seu valor. O segredo está associado ao valor UserSecretsId
do projeto. Por exemplo, execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets set "Movies:ServiceApiKey" "12345"
No exemplo anterior, os dois pontos denotam que Movies
é um objeto literal com a propriedade ServiceApiKey
.
A ferramenta Secret Manager também pode ser usada em outros diretórios. Use a --project
opção para fornecer o caminho do sistema de arquivos no qual o arquivo de projeto existe. Por exemplo:
dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"
Achatamento da estrutura JSON no Visual Studio
O gesto Gerenciar segredos de usuário do Visual Studio abre um secrets.json
arquivo no editor de texto. Substitua o conteúdo de secrets.json
pelos pares chave-valor a serem armazenados. Por exemplo:
{
"Movies": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"ServiceApiKey": "12345"
}
}
A estrutura JSON é achatada após modificações via dotnet user-secrets remove
ou dotnet user-secrets set
. Por exemplo, a execução dotnet user-secrets remove "Movies:ConnectionString"
recolhe o Movies
objeto literal. O ficheiro modificado é semelhante ao seguinte JSON:
{
"Movies:ServiceApiKey": "12345"
}
Definir vários segredos
Um lote de segredos pode ser definido canalizando JSON para o set
comando. No exemplo a seguir, o input.json
conteúdo do arquivo é canalizado para o set
comando.
Abra um shell de comando e execute o seguinte comando:
type .\input.json | dotnet user-secrets set
Aceda a um segredo
Para acessar um segredo, conclua as seguintes etapas:
- Registrar a fonte de configuração de segredos do usuário
- Leia o segredo através da API de configuração
Registrar a fonte de configuração de segredos do usuário
O provedor de configuração de segredos do utilizador regista a fonte de configuração apropriada na API de Configuração do .NET.
A fonte de configuração de segredos do usuário é adicionada automaticamente no modo de desenvolvimento quando o projeto chama CreateDefaultBuilder.
CreateDefaultBuilder
chama AddUserSecrets quando o EnvironmentName é Development:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Quando CreateDefaultBuilder
não for chamado, adicione explicitamente a fonte de configuração dos segredos do utilizador chamando AddUserSecrets em ConfigureAppConfiguration. Chame AddUserSecrets
somente quando o aplicativo for executado no ambiente de desenvolvimento, conforme mostrado no exemplo a seguir:
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();
}
}
Leia o segredo através da API de configuração
Se a fonte de configuração de segredos do usuário estiver registrada, a API de Configuração do .NET poderá ler os segredos.
A injeção do construtor pode ser usada para obter acesso à API de configuração do .NET. Considere os seguintes exemplos de leitura da Movies:ServiceApiKey
chave:
Classe de inicialização:
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 Modelo de página de páginas:
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
}
}
Para obter mais informações, consulte Configuração do Access na inicialização e Configuração do Access no Razor Pages.
Mapeie segredos para um POCO
O mapeamento de um objeto inteiro literal para um POCO (uma classe .NET simples com propriedades) é útil para agregar propriedades relacionadas.
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Para mapear os segredos precedentes para um POCO, use o recurso de vinculação de gráfico de objetos da API de Configuração do .NET. O código a seguir liga-se a um POCO personalizado MovieSettings
e acede ao valor da propriedade ServiceApiKey
.
var moviesConfig =
Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;
Os segredos Movies:ConnectionString
e Movies:ServiceApiKey
são mapeados para as respetivas propriedades em MovieSettings
:
public class MovieSettings
{
public string ConnectionString { get; set; }
public string ServiceApiKey { get; set; }
}
Substituição de strings com segredos
Armazenar senhas em texto sem formatação é inseguro. Nunca armazene segredos num ficheiro de configuração como appsettings.json
, que pode ser verificado num repositório de código-fonte.
Por exemplo, uma cadeia de conexão de banco de dados armazenada em appsettings.json
não deve incluir uma senha. Em vez disso, armazene a senha como um segredo e inclua a senha na cadeia de conexão em tempo de execução. Por exemplo:
dotnet user-secrets set "DbPassword" "<secret value>"
Substitua o marcador de posição <secret value>
no exemplo anterior pelo valor da senha. Defina o valor do segredo na propriedade SqlConnectionStringBuilder de um objeto Password para incluí-lo como o valor da senha na cadeia de ligação.
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();
Listar os segredos
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets list
A seguinte saída é exibida:
Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345
No exemplo anterior, dois pontos nos nomes das chaves denotam a hierarquia de objetos dentro do secrets.json
.
Remover um único segredo
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets remove "Movies:ConnectionString"
O arquivo do secrets.json
aplicativo foi modificado para remover o par chave-valor associado à MoviesConnectionString
chave:
{
"Movies": {
"ServiceApiKey": "12345"
}
}
dotnet user-secrets list
Exibe a seguinte mensagem:
Movies:ServiceApiKey = 12345
Remover todos os segredos
Suponha que o arquivo do secrets.json
aplicativo contenha os dois segredos a seguir:
{
"Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
"Movies:ServiceApiKey": "12345"
}
Execute o seguinte comando a partir do diretório no qual o arquivo de projeto existe:
dotnet user-secrets clear
Todos os segredos de usuário do aplicativo foram excluídos do secrets.json
arquivo:
{}
A execução dotnet user-secrets list
exibe a seguinte mensagem:
No secrets configured for this application.
Gerenciar segredos de usuário com o Visual Studio
Para gerenciar segredos de usuário no Visual Studio, clique com o botão direito do mouse no projeto no gerenciador de soluções e selecione Gerenciar segredos de usuário:
Migrando segredos de usuário do ASP.NET Framework para o ASP.NET Core
Veja o sobre este problema do GitHub.
Segredos de utilizador em aplicações não Web
Projetos que visam Microsoft.NET.Sdk.Web
incluem automaticamente o suporte para segredos de utilizador. Para projetos destinados a Microsoft.NET.Sdk
, como aplicativos de console, instale explicitamente os pacotes NuGet de extensão de configuração e segredos de utilizador.
Utilizando o PowerShell:
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.UserSecrets
Usando a CLI do .NET:
dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.UserSecrets
Depois que os pacotes estiverem instalados, inicialize o projeto e defina segredos da mesma forma que para um aplicativo Web. O exemplo a seguir mostra um aplicativo de console que recupera o valor de um segredo que foi definido com a chave "AppSecret":
using Microsoft.Extensions.Configuration;
namespace ConsoleApp;
class Program
{
static void Main(string[] args)
{
IConfigurationRoot config = new ConfigurationBuilder()
.AddUserSecrets<Program>()
.Build();
Console.WriteLine(config["AppSecret"]);
}
}
Recursos adicionais
- Consulte este problema e este problema para obter informações sobre como acessar segredos de usuário do IIS.
- Configuração no ASP.NET Core
- Provedor de configuração do Azure Key Vault no ASP.NET Core