Si alguna vez has utilizado ASP.NET Core, te habrás dado cuenta de que tiene una opción muy interesante, llamada secretos de usuario, la cual nos permite generar un secrets.json
que se almacenará en local, y permite que si utilizamos un control de código fuente público como GitHub, no hagamos pública información privada como, por ejemplo, nuestra cadena de conexión.
En ASP.NET Core, para poder utilizar esta funcionalidad, basta con que vayamos a Administrar secretos de usuario
en el menú contextual de nuestro proyecto en Visual Studio:
y añadamos las partes del JSON que queremos mantener privadas, consiguiendo así no tener que escribirlas en el appsettings.json
.
Con esto, si vamos al .csproj
, veremos que se ha añadido una línea como esta:
<UserSecretsId>2a2fc01e-0fc6-4b74-b887-0217454d7b14</UserSecretsId>
Que no es más que el GUID (identificador global único) que se ha asignado al proyecto. Con esto, ya es posible acceder a los "secretos de usuario" y utilizar ese JSON privado para nuestros desarrollos. Esto en realidad, lo que hace es guardar un archivo con JSON, aparte del de configuración (appsettings.json
), en la ruta %APPDATA%\Microsoft\UserSecrets\ <user_secrets_id>\secrets.json
.
Esta poderosa característica por desgracia, no está implementada en aplicaciones de consola (habrá que esperar a la versión 3 para ver si lo implementan). De todos modos, tocando un poco algunas cosas, podemos conseguir que nuestras aplicaciones de consola puedan utilizar la funcionalidad de secretos, con solo 5 sencillos pasos.
Paso 1: Creamos a mano el fichero "secrets.json"
En primer lugar, creamos una nueva carpeta dentro de la ruta %APPDATA%\Microsoft\UserSecrets
, por ejemplo, con el nombre AppConsolaCampusMVP
. Dentro de ella creamos un nuevo archivo de texto con el nombre secrets.json
.
Es importante que recordemos el nombre de la carpeta, porque lo necesitaremos más adelante.
Paso 2: Escribimos un parámetro de configuración "secreto"
Dentro del fichero, vamos a guardar una configuración "secreta" de ejemplo, en este caso un simple mensaje:
{
"Mensaje": "CampusMVP"
}
Paso 3: Añadimos las dependencias necesarias
En nuestra aplicación .Net Core, añadimos el paquete:
Microsoft.Extensions.Configuration.UserSecrets
.
Esto se puede conseguir desde la interfaz de usuario del gestor de paquetes del proyecto en Visual Studio, o desde la consola del administrador de paquetes con
PM->Install-Package Microsoft.Extensions.Configuration.UserSecrets
Paso 4: Instanciamos un objeto de configuración
Y con eso, solo nos queda configurar un objeto que nos permita leer la configuración de secretos, y que implemente la interfaz IConfiguration
:
IConfiguration config = new ConfigurationBuilder()
.AddUserSecrets("AppConsolaCampusMVP") //Nombre de la carpeta que hemos creado
.Build();
Esto nos permite añadir el archivo de configuración de secretos que hemos creado, aprovechando la extensibilidad de la clase ConfigurationBuilder
.
Paso 5: Comprobamos los resultados
Con esto, si en el método Main
de nuestra aplicación, después de crear el IConfiguration
, añadimos:
Console.WriteLine($"Mensaje desde los secretos de usuario: '{config["Mensaje"]}'");
Podemos ver que hemos conseguido que nuestra aplicación de consola ya trabaje con los secretos de usuario del mismo modo que una aplicación web.
Programa completo
using Microsoft.Extensions.Configuration;
using System;
namespace AppConsolaCampusMVP
{
class Program
{
static void Main(string[] args)
{
//Obtenemos el nombre de la carpeta que hemos creado
IConfiguration config = new ConfigurationBuilder()
.AddUserSecrets("AppConsolaCampusMVP")
.Build();
Console.WriteLine($"Mensaje desde los secretos de usuario: '{config["Mensaje"]}'");
Console.Read();
}
}
}
Con estos sencillos pasos, hemos conseguido tener una configuración de desarrollo que no se va a hacer pública en nuestro control de versiones ya que se almacena por separado en una carpeta dependiente del usuario.
Para entender mejor todo el proceso, vamos a verlo también en la práctica con un vídeo: