[.Net core] dotnet secrets

juniordevops.pl 5 lat temu

Raz na jakiś czas musimy użyć wrażliwych danych do uruchomienia aplikacji. Mam na myśli na przykład stringa do połączenia a bazą danych w którym zawarty jest login i hasło lub klucze do jakiegoś zewnętrznego API. Nie możemy tego trzymać w otwartym tekście w pliku settings.json. Z pomocą przychodzi Nam Secret Manager. Wszystkie zapisane w ten sposób wartości nie są niczym zakodowane, dalej są trzymane jawnie w pliku ale już ten plik nie znajduje się w katalogu głównym projektu aplikacji i nie zostanie wypchnięty w świat np na githuba.

Zacznijmy od utwórzenia aplikacji MVC. Musimy dodać do pliku *.csproj linijkę kodu:

<PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId> // tą linijkę </PropertyGroup>

Ten długi ciąg liczb i znaków to numer GUID, dobrze o ile sami go wygenerujemy.
Aby utworzyć swój unikalny numer GUID w linuxie, po prostu wpisz komendę uuidgen

lukasz@lukasz-Vostro-5568:~$ uuidgen f11b1f90-bfbe-4f97-8ec6-e2dc1bacb2b9

Gdy już mamy swój unikalny kod, musimy utworzyć folder w specjalnym miejscu zależnym od systemu. Nazwą folderu będzie nasz numer GUID.

Windows File system path: %APPDATA%\Microsoft\UserSecrets\<GUID>\secrets.json MacOS X File system path: ~/.microsoft/usersecrets/<GUID>/secrets.json Linux File system path: ~/.microsoft/usersecrets/<GUID>/secrets.json

Gdy już utworzymy wymagane foldery wejdźmy w tą ścieżkę i utworzmy plik json o nazwię secrets.json, ja zrobiłem to tak:

lukasz@lukasz-Vostro-5568:~/.microsoft/usersecrets/f11b1f90-bfbe-4f97-8ec6-e2dc1bacb2b9$ nano secrets.json

Pliku secrets.json nie musimy tworzyć manualnie. Oczywiście możemy to zrobić, ale o ile użyjemy CLI dotnetu to plik stworzy się automatycznie z zawartością jaką ustawimy. Zróbmy tak

dotnet user-secrets set "ServiceApiKey" "213214234rwer234qwe234"

,
Komenda ta ustawi dane typu klucz/wartość a plik secrets.json będzie wyglądał tak:

{ "ServiceApiKey": "213214234rwer234qwe234" } }

Dostępne są również inne komendy Secret Manager jak np remove, list.

No dobrze, jak już mamy wykonane wszystkie niezbędne kroki opisane powyżej możemy przystąpić do sposobu wykorzystania ukrytych danych w kodzie.
Wartości zapisane w sekretnym miejscu będą dostępne z każdego miejsca w aplikacji o ile wstrzykniemy w konstruktorze klasy obiekt IConfiguration. A żeby dostać się do konkretnego pola, wykorzystamy metodę GetSection z kluczem wartości o tak:

private readonly IConfiguration _configuration; public HomeController(IConfiguration configuration) { _configuration = configuration; } public IActionResult Index() { var test = _configuration.GetSection("ServiceApiKey").Value; return View(); }

Teraz ustaw pułapkę na zmiennej test i uruchom aplikację. Po podejrzeniu zmiennej powinniśmy ujrzeć zapisaną wartość, czyli „213214234rwer234qwe234”.

Kolejną przydatną możliwością jest wczytywanie wielu wartości do klasy POCO(Plain Old CLR Object) – czyli proste klasy trzymające zwykle parę adekwatności. Niestety tutaj musmy manualnie modyfikować plik sercer.json. Jak ktoś zna sposób aby wykorzystać CLI do tego to chętnie posłucham Zmień zawartość pliku na:

{ "ServiceApiKey": { "key": "pierwszy klucz", "key2": "drugi klucz" } }

Teraz twórz klasę o nazwie ServiceKey oddającą zawartość pliku secrets.json, tj w taki sposób:

public class ServiceKey { public string Key { get; set; } public string Key2 { get; set; } }

Teraz musimy zmienić troszkę linijkę w kontrolerze gdzie pobieramy wartość:

var test = _configuration.GetSection("ServiceApiKey") .Get<ServiceKey>();

Po podejrzeniu zmiennej test

Żródła:
https://docs.microsoft.com/pl-pl/aspnet/core/security/app-secrets?view=aspnetcore-2.1&tabs=linux

Idź do oryginalnego materiału