[NaSzybko] #2 Sekretne dane w .NET Core

Do przechowywania sekretnych danych w .NET Core Microsoft zaimplementował specjalne narzędzie. Dzisiaj na szybko pokażę, jak ich używać.

 


Po co są nam sekretne dane?

Pierwszym najbanalniejszym przykładem jest tu connection string. Znajdują się w nim dane, których nie chcielibyśmy udostępniać osobom z zewnątrz. Przy udostępnianiu projektu na publicznych repozytoriach nie musimy się martwić o to, że ktoś zdobędzie nasze dane do połączenia się z bazą danych. Innym przykładem może być login i hasło do konta email z którego wysyłamy maile poprzez aplikację.

Danych takich może być bardzo wiele. Microsoft zadbał o to, aby proces ich dodawania był prosty.


Secret Manager

Secret Manager to narzędzie do przechowywania danych lokalnie na maszynie produkcyjnej. Aby używać go w  naszym projekcie należy dodać referencję do paczki Microsoft.Extensions.SecretManager.Tools.

W przypadku projektu opartego na project.json dodajemy Microsoft.Extensions.SecretManager.Tools do sekcji „tools”. W przypadku projektu opartego na .csproj dodajemy Microsoft.Extensions.SecretManager.Tools do sekcji ItemGroup jako DotNetCliToolReference.

 

Dodanie referencji w pliku .csproj

 

Dodanie referencji w pliku project.json

 

Przy projektach tworzonych z szablonu paczka ta zazwyczaj jest już dodana.

Po dodaniu paczki do projektu należy pamiętać o komendzie dotnet restore.

Aby przetestować czy nasza paczka prawidłowo się dodała wywołujemy komendę

dotnet user-secrets -h

upewniając się, że znajdujemy się w katalogu projektu.

Następnie dodajemy do pliku project.json lub .csproj nasze ID. Może ono mieć dowolną formę, powinno być jednak unikalne dla danego projektu.

W przypadku .csproj dodajemy tak:

Dodanie ID użytkownika w pliku .csproj

W przypadku project.json dodajemy tak:

Dodanie ID użytkownika w pliku project.json

Jesteśmy już gotowi dodać swoje dane. Robimy to poprzez komendę

dotnet user-secrets set NazwaSekretu WartoscSekretu

upewniając się wcześniej, że jesteśmy w katalogu projektu.

Możemy również zrobić to będąc w innej lokalizacji, należy jednak wtedy dodać ścieżkę do projektu poprzedzając ją –project

Przykład:

dotnet user-secrets set NazwaSekretu WartoscSekretu --project C:\folder\folder2\projekt\src

Gdzie i jak przechowywane są dane

W zależności od systemu, zmienne przechowywane są w podanych folderach:

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

Jak widać, dane przechowywane są w pliku JSON. NIE SĄ ONE SZYFROWANE. Przynajmniej na razie, bo padły zapewnienia, że kiedyś będą. Kiedy? Typowo dla Microsoftu: SOONTM 😉


Dostęp do danych w kodzie

Dostęp do danych jest banalnie prosty.

W metodzie Startup należy dodać linijkę kodu konfigurującą odczyt danych.

builder.AddUserSecrets();

 

Aby dane były odczytywane tylko w środowisku deweloperskim należy otoczyć ten kod if’em:   

if (env.IsDevelopment())  

{        

    builder.AddUserSecrets();  

}

 

Jesteśmy już w stanie dostać się do naszych danych. Aby odczytać wartość sekretu wystarczy odwołać się poprzez API Configuration:

string test = Configuration["NazwaSekretu"];

 

Przykładowy kod wykorzystujący sekretne dane

 

Należy pamiętać, że jeżeli ustawiliśmy odczyt danych tylko w środowisku deweloperskim, należy ustawić nasze środowisko na deweloperskie właśnie. W innym wypadku dane nie zostaną odczytane.


Ustawienie środowiska na deweloperskie

Opiszę tutaj jedynie na szybko jak to zrobić. Dla chcących głębiej zasięgnąć tematu zapraszam tutaj: Working with multiple environments

 

Visual Studio z tego co zauważyłem ma automatycznie przypisane środowisko jako deweloperskie.

Dla pewności należy udać się w opcje debugowania i dla danego profilu ustawić zmienną ASPNETCORE_ENVIRONMENT na „Development”

Ustawienie środowiska na deweloperskie w Visual Studio

 

Aby ustawić środowisko globalnie należy w zależności od systemu zrobić:

 

WINDOWS

  •  na czas sesji

W konsoli wpisujemy

setx ASPNETCORE_ENVIRONMENT "Development"

lub też poprzez powershell

$Env:ASPNETCORE_ENVIRONMENT = "Development"

Zmienne te będą aktywne tylko do czasu zamknięcia danego okienka.

  • globalnie

Przechodzimy do Panel Sterowania > System i zabezpieczenia > System > Zaawansowane ustawienia systemy > Zmienne środowiskowe

I w sekcji Zmienne systemowe dodajemy zmienną ASPNETCORE_ENVIRONMENT ustawiając wartość na „Development”

Ustawienie środowiska na developerskie poprzez zmienną globalną w Windows10

 

 

macOS

  • na czas sesji
ASPNETCORE_ENVIRONMENT=Development dotnet run

lub:

export ASPNETCORE_ENVIRONMENT=Development
  • globalnie:

edytujemy plik .bashrc lub .bash_profile i dodajemy

export ASPNETCORE_ENVIRONMENT=Development

 

Linux

  • na czas sesji:
export ASPNETCORE_ENVIRONMENT=Development
  • globalnie:

edytujemy plik .bash_profile i dodajemy

export ASPNETCORE_ENVIRONMENT=Development

Na dzisiaj to tyle. Wyszło nieco dłużej, ale myślę że to i tak takie minimum jakie należy wiedzieć w przypadku sekretnych danych.

Dzięki za odwiedziny i do zobaczenia! Cześć!

 

Oficjalne wpisy Microsoftu:

 

2 komentarzy

  1. Bardzo fajny wpis, ale nie wiesz może czy istnieje coś takiego dla zwykłego .NET’a?

    1. juniornetdev says: Odpowiedz

      Wydaje mi się, że nie, ale nie zagłębiałem tematu. Widziałem rozwiązania z plikami .config które są po prostu dodawane do .gitignore i to tam przechowuje się wszystkie sekretne dane.

Dodaj komentarz