Wyślij zapytanie Dołącz do Sii

JWT jest to standard uwierzytelniania oparty o tokeny (RFC 7519) [1]. Zakłada on stworzenie specjalnego obiektu, który jest przesyłany do i z serwera. Protokół HTTPS jest bezstanowy, nie wymaga przechowywania informacji o użytkownikach na serwerze przez czas trwania żądań. Token JWT jest dodawany do danych w zapytaniach, mając na celu autoryzacje lub uwierzytelnienie na serwerze. Po stronie klienta są zapisywane w np. pamięci (w przypadku przeglądarki) localStorage.

Azure Active Directory jest to usługa umożliwiająca zarządzanie tożsamościami dla aplikacji internetowych i nie tylko. Korzysta ona z protokołu uwierzytelnienia OAuth 2.0. Można ją wykorzystać do uwierzytelnienia użytkowników na różnych platformach, np. w aplikacjach mobilnych lub internetowych. Po zalogowaniu użytkownika może zwrócić token JWT. Umożliwia aplikacji uwierzytelnienie użytkownika i dostęp do danych znajdujących się w aplikacji. [2] Jest to przykład użycia istniejącego dostawcy w celu zdobycia tokenu JWT. Jest to przydatne w przypadku pracy w aplikacjach dla firm korzystających z tego rozwiązania lub innych dostawców jak np. Google, Facebook.

Na rys. 1 przedstawiony jest diagram sekwencyjny, pokazujący tworzenie i użycie tokenu JWT. Użytkownik wypełnia formularz logowania w aplikacji, następnie są wysyłane dane do serwera. Serwer sprawdza, czy są podane prawidłowe dane do autentykacji, tworzy token, który jest wysyłany w odpowiedzi do użytkownika. Aplikacja klienta przechwytuje token, zapisuje w pamięci (np. Cookies lub LocalStorage). Przy kolejnych akcjach użytkownika token jest dołączany, aby uwierzytelnić operacje.

Diagram sekwencyjny, użycie tokenu JWT
Rys. 1 Diagram sekwencyjny, użycie tokenu JWT Źródło: Opracowanie własne

Token jest to obiekt, który został podzielony na trzy części:

  • nagłówek (Header) – obiekt JSON, zakodowany formatem base64; zawiera informacje takie jak typ tokenu oraz nazwa algorytmu,
  • zawartość (Payload) – obiekt JSON, również zakodowany formatem base64; zawarte są tutaj atrybuty użytkownika, np. identyfikator użytkownika, adres email, rola; zawartość ta nie powinna zawierać informacji poufnych, gdyż nie są one szyfrowane,
  • podpis (Signature) – służy do weryfikacji po stronie serwera czy token zawiera poprawne informacje; jest to cyfrowa sygnatura generowana przez połączenie nagłówka i zawartości i zakodowana przez klucz prywatny znany tylko przez serwer.

Gdyby użytkownik atakujący system chciał zmienić zawartość tokenu, musiałby także wygenerować podpis ponownie – w tym momencie jest to już nie możliwe, gdyż klucz jest dostępny tylko na serwerze, niedostępny po stronie klienta.

Ważniejsze atrybuty, które warto znać i powinny być dołączona do zawartości:

  • jti – unikalny identyfikator JWT,
  • iss – zleceniodawca, który wydaje token,
  • sub – identyfikuje podmiot, musi być unikalny,
  • aud – identyfikuje odbiorców, dla których jest przeznaczony,
  • exp – określa czas wygaśnięcia tokenu.

Stworzona została klasa AccountsService, która zawiera w sobie metody pozwalające na rejestrację, logowanie i odświeżenie tokenu użytkownika. Na rys. 2 pokazano metodę, która ilustruje, w jaki sposób użytkownik może być uwierzytelniany oraz jak tworzy się token JWT.

Kod opisujący metody klasy AccountsService
Rys. 2 Metody klasy AccountsService
Źródło: opracowanie własne

Dodanie konfiguracji JWT do projektu:

  • modyfikacja klasy Startup – na rys. 3 jest kod, który zostaje dodany w celu konfiguracji autentykacji przez JWT dopisany do metody ConfigureServices; zostaje dołączona klasa reprezentująca użytkownika, schemat tokenu JWT oraz walidacja jego parametrów; wymagane jest także włączenie autentykacji w metodzie Configure pokazane na rys. 4,
  • dodanie dodatkowych informacji do tworzenia tokenu JWT – na rys. 5 jest przykładowa konfiguracja pliku JSON projektu.

Kod dopisany do klasy Startup w celu konfiguracji JWT
Rys. 3 Kod dopisany do klasy Startup w celu konfiguracji JWT
Źródło: opracowanie własne
Kod dopisany do klasy Startup w celu włączenia autentykacji
Rys. 4 Kod dopisany do klasy Startup w celu włączenia autentykacji
Źródło: opracowanie własne

Klasa użytkownika dziedziczy po IdentityUser. Jest to implementacja paczki ASP .NET Core Identity. Zawiera podstawowe właściwości, takie jak identyfikator użytkownika, adres email oraz hasło. W przypadku korzystania Entity Framework Core należy dodać paczkę nuget Microsoft.AspNetCore.Identity.EntityFrameworkCore.

Dla uproszczenia przykładu ustawienia zostały zapisane w pliku appsettings.json. Docelowo należy jednak skorzystać z bardziej bezpiecznych rozwiązań. Można wykorzystać Azure Key Vault [3]dla przypadku wspomnianego na początku artykułu lub w usersecrets.json[4].

Kod opisujący konfigurację pliku appsettings.json
Rys. 5 Konfiguracja pliku appsettings.json
Źródło: opracowanie własne

Metody w kontrolerach wymagające uwierzytelnienia muszą zostać opatrzone atrybutem Authorize. W przypadku tokenu JWT trzeba dodać jeszcze konfigurację schematu w atrybucie. Przykład takiego użycia atrybutu na całym kontrolerze jest pokazany na rys. 6.

Kod z atrybutami dla klasy, autoryzacja całego kontrolera
Rys. 6 Kod z atrybutami dla klasy, autoryzacja całego kontrolera
Źródło: opracowanie własne

Uwierzytelnianie za pomocą tokenów JWT zostało stworzone z myślą o aplikacjach mobilnych i SPA. Jest to proste w obsłudze rozwiązanie, wymagające jednak sporej konfiguracji. Elastyczność polityki autoryzacji w ASP .NET Core pozwala na integrację dodatkowych, zewnętrznych dostawców.


[1] https://tools.ietf.org/html/rfc7519

[2] https://docs.microsoft.com/pl-pl/azure/active-directory/develop/v1-protocols-oauth-code

[3] https://docs.microsoft.com/pl-pl/azure/key-vault/basic-concepts

[4] https://docs.microsoft.com/pl-pl/aspnet/core/security/app-secrets?view=aspnetcore-2.2&tabs=windows

5/5 ( głosy: 2)
Ocena:
5/5 ( głosy: 2)
Autor
Avatar
Michał Świtalik

Software Engineer w Centrum Kompetencyjnym Office 365 w Sii. W pracy zajmuje się tworzeniem solucji dla obrotu i udostępnianiem dokumentów i informacji w biznesie, które wykorzystują technologie SharePointa. Po pracy lubi rozwijać swoje umiejętności w frameworkach JS (Angular, React, SPFX...), .Net oraz architekturze.

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Może Cię również zainteresować

Pokaż więcej artykułów

Bądź na bieżąco

Zasubskrybuj naszego bloga i otrzymuj informacje o najnowszych wpisach.

Otrzymaj ofertę

Jeśli chcesz dowiedzieć się więcej na temat oferty Sii, skontaktuj się z nami.

Wyślij zapytanie Wyślij zapytanie

Natalia Competency Center Director

Get an offer

Dołącz do Sii

Znajdź idealną pracę – zapoznaj się z naszą ofertą rekrutacyjną i aplikuj.

Aplikuj Aplikuj

Paweł Process Owner

Join Sii

ZATWIERDŹ

This content is available only in one language version.
You will be redirected to home page.

Are you sure you want to leave this page?