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.
Note
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Warning
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 10 deste artigo.
Por Rick Anderson e Kirk Larkin
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.
Ver ou transferir o código de exemplo (como transferir)
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 utilizador numa aplicação de consola .NET, consulte GitHub dotnet/entityframework.docs problema #3939.
Trabalho com 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 ligação predefinida à base de dados está incluída no ficheiro appsettings.json do projeto com a chave DefaultConnection. A cadeia de conexão padrão é para LocalDB, que é executado no modo de usuário e não requer uma senha. Durante a implementação da aplicação, pode substituir o valor da chave DefaultConnection pelo valor de uma variável de ambiente. A variável ambiente pode armazenar a cadeia de ligação completa com credenciais sensíveis.
Warning
As variáveis de ambiente são normalmente armazenadas como texto simples, não encriptado. Se a máquina ou processo for comprometido, variáveis de ambiente ficam acessíveis a partes não confiáveis. Poderão ser necessárias medidas adicionais para evitar a divulgação de segredos de utilizador.
O separador de dois pontos (:) não funciona com as chaves hierárquicas das variáveis de ambiente em todas as plataformas. Por exemplo, Bash não suporta dois pontos (:) como separador. Todas as plataformas suportam a sintaxe de duplo sublinhado (__) e substituem-na automaticamente por dois pontos (:).
Utilize a ferramenta Secret Manager
O Secret Manager é uma ferramenta que armazena dados sensíveis durante o desenvolvimento de aplicações. Neste contexto, um dado sensível é um segredo de aplicação.
- Os segredos do aplicativo são armazenados em um local separado da árvore do projeto.
- Estão associadas a um projeto específico ou partilhadas em vários projetos.
- Eles não estão submetidos ao controlo de versões.
Warning
O Secret Manager não encripta os segredos armazenados e não deve ser tratado como uma loja de confiança. É 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.
O Secret Manager esconde 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
No caminho do sistema de ficheiros, substitua a parte <user_secrets_id> pelo valor UserSecretsId especificado no ficheiro do seu projeto.
Não escrevas código que dependa da localização ou do formato dos dados guardados com o Secret Manager. Estes detalhes de implementação podem mudar. Por exemplo, os valores secretos não são criptografados.
Ativar armazenamento secreto
O Secret Manager funciona com definições de configuração específicas do projeto armazenadas no seu perfil de utilizador.
Utilizar a CLI
O Gestor Secreto inclui um init comando. Para usar segredos de usuário, execute o seguinte comando no diretório do projeto:
dotnet user-secrets init
Este comando adiciona um UserSecretsId elemento dentro de a PropertyGroup do ficheiro do projeto. Por padrão, o texto interno do UserSecretsId é um GUID. O texto interno é arbitrário, mas é exclusivo do projeto. O exemplo seguinte mostra um valor GUID de 0000a1a1-b2b2-c3c3-d4d4-eeeeee555555.
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<UserSecretsId>0000a1a1-b2b2-c3c3-d4d4-eeeeee555555</UserSecretsId>
</PropertyGroup>
</Project>
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 dos atributos de informações do assembly (GenerateAssemblyInfo) estiver desativada (configurada para false), adicione manualmente UserSecretsIdAttribute ao ficheiro AssemblyInfo.cs. Por exemplo:
[assembly: UserSecretsId("your_user_secrets_id")]
Quando adiciona manualmente o UserSecretsId atributo ao ficheiro AssemblyInfo.cs , o UserSecretsId valor tem de corresponder ao valor no ficheiro do 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"
Neste exemplo, os dois-pontos indicam que Movies é um objeto literal com uma propriedade ServiceApiKey.
Também podes usar o Secret Manager de outros diretórios. Inclua a --project opção de fornecer o caminho do sistema de ficheiros onde o ficheiro do 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 Visual Studio Gerir Segredos de Utilizador abre um ficheiro secrets.json no editor de texto. Substitua o conteúdo do ficheiro secrets.json pelos pares chave-valor a armazenar. 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 através do dotnet user-secrets remove comando 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 seguinte, o conteúdo do ficheiroinput.json é encaminhado para o set comando.
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
O provedor de configuração de segredos do utilizador regista a fonte de configuração apropriada na API de Configuração do .NET.
As aplicações Web do ASP.NET Core criadas com o comando dotnet new ou o Visual Studio geram o seguinte código:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
O método WebApplication.CreateBuilder inicializa uma nova instância da WebApplicationBuilder classe com predefinições pré-definidas. O WebApplicationBuilder inicializado (builder) fornece a configuração predefinida e chama o método AddUserSecrets quando a propriedade EnvironmentName é Development.
Leia o segredo através da API de configuração
Os exemplos seguintes demonstram como ler a 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 do Pages
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.
Assuma que o ficheiro secrets.json da aplicação contém os dois segredos seguintes:
{
"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; }
}
Utilize a substituição de cadeias de caracteres com segredos
Armazenar senhas em texto sem formatação é inseguro. Nunca guarde segredos num ficheiro de configuração como appsettings.json, que possa ser registado num repositório de código-fonte.
Por exemplo, uma cadeia de ligação a uma base de dados armazenada num ficheiro appsettings.json não deve incluir uma palavra-passe. 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 <secret value> marcador no exemplo pelo valor da palavra-passe. 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
Assuma que o ficheiro secrets.json da aplicação contém os dois segredos seguintes:
{
"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, os dois-pontos (:) nos nomes das chaves indicam a hierarquia de objetos no ficheiro secrets.json.
Remover um único segredo
Suponha que o ficheiro secrets.json da aplicação contém os dois segredos seguintes:
{
"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 ficheiro secrets.json da aplicação é alterado para remover o par chave-valor associado à chave Movies:ConnectionString:
{
"Movies": {
"ServiceApiKey": "12345"
}
}
O dotnet user-secrets list comando apresenta a seguinte mensagem:
Movies:ServiceApiKey = 12345
Remover todos os segredos
Assuma que o ficheiro secrets.json da aplicação contém os dois segredos seguintes:
{
"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 utilizador da aplicação são eliminados do ficheirosecrets.json :
{}
Ao executar o dotnet user-secrets list comando, apresenta-se a seguinte mensagem:
No secrets configured for this application.
Gerenciar segredos de usuário com o Visual Studio
Para gerir segredos de utilizador em Visual Studio, clique com o botão direito no projeto em Explorador de Soluções e selecione Gerir Segredos de Utilizador:
Migrar segredos de utilizador do ASP.NET Framework para o ASP.NET Core
Pode migrar os seus segredos de utilizador armazenados do ASP.NET Framework para o ASP.NET Core. Para mais informações, consulte GitHub dotnet/aspnetcore.docs issue #27611 - User Secrets a documentação não menciona incompatibilidade com AssemblyInfo.cs.
Trabalhar com 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.
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.UserSecrets
Depois de instalares os pacotes, inicializa o projeto e define os segredos da mesma forma que numa aplicação web. O exemplo seguinte mostra uma aplicação de consola que recupera o valor de um conjunto secreto com a AppSecret chave:
using Microsoft.Extensions.Configuration;
namespace ConsoleApp;
class Program
{
static void Main(string[] args)
{
IConfigurationRoot config = new ConfigurationBuilder()
.AddUserSecrets<Program>()
.Build();
Console.WriteLine(config["AppSecret"]);
}
}
Conteúdo relacionado
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.
Warning
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 de dois pontos (:) não funciona com as chaves hierárquicas das variáveis de ambiente em todas as plataformas. Por exemplo, Bash não suporta dois pontos (:) como separador. Todas as plataformas suportam a sintaxe de duplo sublinhado (__) e substituem-na 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.
Warning
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. Chamar AddUserSecrets apenas quando a aplicação estiver a correr no Development ambiente, como mostrado no seguinte exemplo:
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.
Assuma que o ficheiro secrets.json da aplicação contém os dois segredos seguintes:
{
"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
Assuma que o ficheiro secrets.json da aplicação contém os dois segredos seguintes:
{
"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
Assuma que o ficheiro secrets.json da aplicação contém os dois segredos seguintes:
{
"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
Assuma que o ficheiro da aplicação secrets.json contém os dois segredos seguintes:
{
"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.
Usando 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