Escolha uma Página
(Last Updated On: 27/06/2018)

Usando a ferramenta “Secret Manager” no Visual Studio 2017

Você pode usar a ferramenta Secret Manager no desenvolvimento de seus aplicativos e com ele manter seus segredos fora do seu código. Assim, você nunca deve armazenar senhas ou outros dados confidenciais no código-fonte. Além do que, você não deve e precisa usar segredos de produção em modo de desenvolvimento e teste (principalmente se usar repositórios públicos).

Você pode configurar o aplicativo para ler esses valores de variáveis de ambiente ou de valores armazenados usando a ferramenta Secret Manager. Com a ferramenta Secret Manager você evita que dados confidenciais sejam verificados nos programas fonte.

Usando Variáveis de Ambiente

Para evitar armazenar segredos de aplicativos em código ou em arquivos de configuração local, você pode armazenar segredos em variáveis de ambiente. Você pode configurar a estrutura de configuração para ler valores de variáveis de ambiente chamando AddEnvironmentVariables. Você pode então usar variáveis de ambiente para substituir valores de configuração para todas as fontes de configuração previamente especificadas.

Exemplo: se você criar um novo aplicativo da Web ASP.NET Core com contas de usuário individuais, ele adicionará uma seqüência de conexão padrão ao arquivo appsettings.json no projeto com a chave DefaultConnection. A cadeia de conexão padrão é inicialmente configurada para usar o LocalDB, que é executado no modo usuário e não requer uma senha. Mas quando você implanta seu aplicativo em um servidor de teste ou produção, você terá que substituir o valor da chave DefaultConnection com uma configuração de variável de ambiente que conterá toda a seqüência de conexão (potencialmente com credenciais sensíveis, como usuário e senha), para que seja acessado o banco de dados no servidor de teste ou de produção.

Cuidado

As variáveis de ambiente geralmente são armazenadas em texto simples e não são criptografadas. Se a máquina ou o processo estiverem comprometidos, então as partes não confiáveis podem acessar as variáveis de ambiente. Medidas adicionais para evitar a divulgação de segredos de usuários ainda podem ser necessárias…

Usando a ferramenta Secret Manager

A ferramenta Secret Manager armazena dados confidenciais para o trabalho de desenvolvimento fora da árvore de arquivos do seu projeto. Que pode ser usada para armazenar segredos no seu  projeto do .NET Core durante o desenvolvimento. Com a ferramenta Secret Manager, você pode associar segredos de aplicativos a um projeto específico e compartilhá-los em vários projetos.

Cuidado

A ferramenta Secret Manager não criptografa os segredos armazenados e não deve ser tratada como uma “depósito” confiável. Serve apenas para fins de desenvolvimento. As chaves e os valores são armazenados em um arquivo de configuração JSON no diretório do perfil do usuário….

Visual Studio 2017: Instalando a ferramenta Secret Manager

Clique com o botão direito do mouse no projeto, dentro da janela Solution Explorer. Selecione Editar <bome_do_projeto> .csproj no menu de contexto. Adicione a linha destacada ao arquivo .csproj e salve para restaurar o pacote NuGet associado (em XML):

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup>
    <UserSecretsId>My-USER-SECRET-ID-HERE-c23d27a4-eb88</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>
  
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="1.1.1" />
  </ItemGroup>

<!-- ACRESCENTAR -->
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.1" />
  </ItemGroup>
<!-- FIM ACRESCENTAR -->

</Project>

Agora clique com o botão direito do mouse no projeto, na janela do Solution Explorer e selecione Gerenciar Segredos de Usuário (Manage User Secrets),  no menu de contexto. Esta ação adicionará um novo nó UserSecretsId dentro de um PropertyGroup do arquivo .csproj. Ele também abre um arquivo secrets.json no editor de texto. Adicione o seguinte ao secrets.json:

{
    "MeuSegredo": "ValorDoMeuSegredo"
}

Se precisar colocar mais de um “segredo”, separe com vígulas:

{
    "MeuSegredo1": "ValorDoMeuSegredo1",
    "MeuSegredo2": "ValorDoMeuSegredo2",
    "MeuSegredo3": "ValorDoMeuSegredo3"
}

Teste a ferramenta Secret Manager executando o seguinte comando (na CONSOLE):

dotnet user-secrets -h

Você deve estar no mesmo diretório que o arquivo .csproj para executar as ferramentas definidas nos nós DotNetCliToolReference do arquivo .csproj.

A ferramenta Secret Manager exibirá uso, opções e comandos de ajuda:

dotnet user-secrets -h

Usage: dotnet-user-secrets [options] [command]
Options:
  -?|-h|--help  Show help information
  -v|--verbose  Verbose output
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

A ferramenta Secret Manager opera com parâmetros de configuração específicas de projeto, que ficam armazenados no diretório do seu perfil de usuário. Para usar seus segredos de “usuário”, o projeto deve especificar um valor UserSecretsId dentro do seu arquivo .csproj. O valor de UserSecretsId é arbitrário, mas geralmente é algo exclusivo de um projeto seu. Os desenvolvedores tipicamente geram um GUID para o UserSecretsId.

GUID (ou UUID) é um acrônimo para ‘Globally Unique Identifier’ (ou ‘Universal Unique Identifier’). É um número inteiro de 128 bits usado para identificar recursos. O termo GUID é geralmente usado por desenvolvedores que trabalham com tecnologias da Microsoft. Exemplo de GUID:

4f750817-77be-48ec-90e3-dc7bf92671b2

Você pode gerar on-line um GUID se quiser: Online GUID Generator

Depois disso adicione o UserSecretsId no seu projeto, no arquivo .csproj (em XML):

<PropertyGroup>
  <UserSecretsId>MINHA-ID-DE-USUARIO-SECRETA-AQUI-c23d27a4-eb88</UserSecretsId>
</PropertyGroup>

Se fosse a GUID do nosso exemplo, ficaria:

<PropertyGroup>
  <UserSecretsId>4f750817-77be-48ec-90e3-dc7bf92671b2</UserSecretsId>
</PropertyGroup>

Você pode usar a ferramenta Secret Manager para estabelecer um segredo por linha de comando. Por exemplo, em uma janela de comando no diretório do projeto, digite o seguinte:

dotnet user-secrets set MySecret ValueOfMySecret

Você pode executar a ferramenta Secret Manager de outros diretórios, mas você deve usar a opção –project para passar no caminho para o arquivo .csproj:

dotnet user-secrets set MySecret ValueOfMySecret --project c:\work\WebApp1\src\webapp1

Você também pode usar a ferramenta Secret Manager para listar, remover e limpar segredos de aplicativos.

Acessando seus segredos de usuário por meio do arquivo de configuração do projeto

Você acessa os segredos do Secret Manager através do aruquivo de configuração do sistema (método Startup.cs). Adicione o pacote Microsoft.Extensions.Configuration.UserSecrets e execute, na console,  dotnet restore.

dotnet restore

 

Adicione a fonte de configuração dos segredos de usuário ao método Startup:

Adicione a configuração dos segredos no arquivo Startup.cs, como no exemplo:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace UserSecrets
{
    public class Startup
    {
        string _testSecret = null;
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder();

            if (env.IsDevelopment())
            {
                   //VAI USAR NO AMBIENTE DE DESENVOLVIMENTO
                  builder.AddUserSecrets<Startup>();
            }

            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            //A VARIAVEL PODE SER CHAMADA DE OUTROS FONTES C#
            var _testaSegredo = Configuration["NomeDoMeuSegredo"];
        }

        public void Configure(IApplicationBuilder app)
        {
            var result = string.IsNullOrEmpty(_testaSegredo) ? "Null" : "Not Null";
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync($"Meu segredo é {result}");
            });
        }
    }
}

Note que as variáveis não são usadas em ambiente de produção, etc. Nestes ambientes você pode usar Variáveis de Ambiente ou configurações do Azure que sobrescrevem os arquivos de configuração (web.config ou appsettings.json).

Quando quisermos utilizar os segredos no nosso código, fazemos algo do tipo:

var emailConfig = new EmailConfiguration(Configuration["ContaDeEmail"], Configuration["SenhaDeEmail"]);

ContaDeEmail e SenhaDeEmail são informações que você poder guardar no UserSecrets, no ambiente de desenvolvimento. No ambiente de produção podem estar nas configurações do Azure. Não será necessário mudar seu código pois o ASP.NET Core abstrai isso para você.

Um jeito mais elegante (e  poderoso) de usar as variáveis geradas na Ferramenta Secret Manager

Já vimos que os segredos de usuário são armazenados nos diretórios de aplicação (APPDATA) de cada usuário. Você deve atribuir um userSecretsId exclusivo para cada aplicativo que usa segredos.  Isso é usado para criar um diretório de aplicativos exclusivo no diretório de perfil do usuário que armazenará o arquivo secrets.json contendo segredos de usuário.

local de arquivos secret manager

Esse local varia conforme o sistema operacional:

Windows: %APPDATA%\microsoft\UserSecrets\<usersecretsid>\secrets.json
Linux: ~/.microsoft/usersecrets/<usersecretsid>/secrets.json
Mac: ~/.microsoft/usersecrets/<usersecretsid>/secrets.json

Para criar um arquivo com os dados:

{
  "DataService.PublicKey": "abcd",
  "DataService.PrivateKey": "efgh"
}

Você digita no diretório da aplicação o comando dotnet user-secrets set . que é executado e gera uma linha de informação dando feedback  você se tudo deu certo:

dotnet user-secrets set DataService.PublicKey abcd
info: Successfully saved DataService.PublicKey = abcd to the secret store.

dotnet user-secrets set DataService.PrivateKey efgh
info: Successfully saved DataService.PrivateKey = efgh to the secret store.

Configuração ASP.NET Core e User Secrets

A dependência Microsoft.Extensions.Configuration.UserSecrets adicionada anteriormente adiciona um método de extensão que nos permite chamar AddUserSecrets ao criar a Configuração do núcleo do ASP.NET. Os segredos de dados DataService.PublicKey e DataService.PrivateKey podem ser lidos a partir da configuração e usados para ajudar a configurar o DataService. Você pode fazer tudo isso na classe de Inicialização, no arquivo Startup.cs.

using NomeDaSuaAplicacao.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace NomeDaSuaAplicacao {
    public class Startup {
        public Startup(IHostingEnvironment env) {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath);

            builder.AddUserSecrets();

            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        public void ConfigureServices(IServiceCollection services) {
            services.AddMvc();

            var publicKey = Configuration["DataService.PublicKey"];
            var privateKey = Configuration["DataService.PrivateKey"];

            services.AddTransient<IDataService>(_ => new DataService(publicKey, privateKey));
        }

        public void Configure(IApplicationBuilder app) {
            app.UseMvcWithDefaultRoute();
        }
    }
}

E definir uma classe para esses serviços:

namespace NomeDaSuaAPlicacao.Services {
    public interface IDataService {
        string PublicKey { get; }
    }

    public class DataService : IDataService {
        private readonly string _publicKey;
        private readonly string _privateKey;

        public DataService(string publicKey, string privateKey) {
            _publicKey = publicKey;
            _privateKey = privateKey;
        }

        public string PublicKey { get { return _publicKey; } }
    }
}

Controlador (controller) e Visualizador (view) do ASP.NET Core

Certifique-se de que isso esteja funcionando como esperado, criaando um ASP.NET Core MVC Controller e uma View para exibir a chave pública armazenada no arquivo secrets.json.

Controlador (controller)

using Microsoft.AspNetCore.Mvc;

namespace NomeDaSuaAplicacao.Controllers {
    public class HomeController : Controller {
        public IActionResult Index() {
            return View();
        }
    }
}

Visualizador (view)

@using NomeDaSuaAplicaco.Services
@inject IDataService dataService
<!DOCTYPE html>
<html>
<head>
    <title>Serviço de Leitura de Chave da Aplicação</title>
</head>
<body>
    <h1>Nome da Sua Aplicação - Leitura de Chave Pública</h1>
    <p>Chave Pública: @dataService.PublicKey</p>
</body>
</html>

ASP.NET Core View Injection

Uma outra forma de visualizar os dados: ao invés de injetar o DataService no controlador, injete DataService diretamente no visualizador (view) usando @inject, logo no cabeçalho do arquivo.

@inject IDataService dataService

Uma vez que o serviço é injetado no visualizador, é possível exibir o segredo do usuário em qualquer parte do Razor de qualquer página de Visualização.

<p>Chave Pública: @dataService.PublicKey</p>

Você pode usar esta técnica para mostrar dados que se repetem em vários locais ou mesmo dados em views compartilhadas (shared), como a página _Layout.cshtml, que em geral é o pano de fundo para as demais (ou várias) páginas do sistema. Outro uso para o segredos são as chaves de API (autenticação) de serviços do Google e provedores de e-mail como SendGrid.

Algumas outras formas de implementar são apresentadas nas referências 5 a 8, abaixo. São ótimos artigos com boas dicas de implementação prática.

Se você tiver dúvidas ou contribuições, deixe-me um comentário abaixo.

Referências:  

  1. Safe storage of app secrets during development (MICROSOFT)
  2. Configuration in ASP.NET Core
  3. ASP.NET Core – usando UserSecrets para armazenar informações sensíveis
  4. USER SECRETS IN ASP.NET CORE MVC WEB APPLICATION
  5. User Secrets in ASP.NET Core
  6. User Secrets – Storing sensitive data in ASP.NET Core projects
  7. User Secret management in ASP.NET Core
  8. Working with user secrets in ASP.​NET Core applications

Obrigado pela sua leitura. Continue visitando este blog e compartilhe artigos em sua rede de relacionamento. Por favor, se quiser, registre sugestões e comentários ao final da página.

Você quer ter uma franquia de hospedagem com tudo para marketing digital e faturamento recorrente?

franquia builderall business