• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ASP.NET Core JWT Tokens

VPS Starter Arubacloud
+1 głos
567 wizyt
pytanie zadane 20 lipca 2021 w C# przez tomasz12345 Użytkownik (750 p.)

Witam, pisze prostą aplikację i chcialem dodać logowanie, może mi ktoś odpowiedziec na poniższe pytania pod kodem? dotyczą w sumie tylko czerwonej częsci kodu, dodałem całą logikę aby było wiadomo o co chodzi

 

[HttpPost("login")]
        public string Login([FromBody] LoginDTO loginDTO)
        {
            //this logic has to be move into service
            var user = _myLibrusDbContext.Users
                .Include(x => x.Role)
                .FirstOrDefault(x => x.Mail == loginDTO.Email);


            // logic if user exist

            //check if password is okey 
            var result = _hasher.VerifyHashedPassword(user, user.PasswordHashed, loginDTO.Password);
            if(result == PasswordVerificationResult.Failed)
            {
                throw new BadHttpRequestException("Bad password or username");
            }

            var claims = new List<Claim>()
            {
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                new Claim(ClaimTypes.Name, $"{user.FirstName} {user.LastName}"),
                new Claim(ClaimTypes.Role, user.Role.RoleName),
                new Claim("email", user.Mail.ToString()),
            };

            //here we generate private key
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_authenticationSettins.JwtKey));
            //here we generate credencials
            var cred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            //here we generate expires time of token
            var expires = DateTime.Now.AddDays(_authenticationSettins.JwtExpireDays);
            // issuer, audience( clients of api)
            var token = new JwtSecurityToken(
                _authenticationSettins.JwtIssuer,
                _authenticationSettins.JwtIssuer,
                claims,
                expires: expires,
                signingCredentials: cred);

            var tokenHandler = new JwtSecurityTokenHandler();

           return tokenHandler.WriteToken(token);

 

 

Czy ktoś może mi wyjaśnić co dokladnie przypisywanie jest do zmienney key, a co do cred?

co to są te credencials? I dlaczego wkładamy tam key skoro jest on juz zaszyfrowany? móglby mi ktoś to wytlumaczyć?

 

PS. wiem, że logiki sie nie pisze w kontrolerze, to tylko w celach testowych aby bylo szybciej

2 odpowiedzi

+2 głosów
odpowiedź 10 sierpnia 2021 przez Wiciorny Ekspert (269,120 p.)

Chciałem dodać coś w kwestii kluczy : klucze są używane do szyfrowania podpisu dla tokenu 
 

W przypadku algorytmu RS256 także będziemy mieć do czynienia z cyfrowym podpisem, który będzie dowodził tego, że nasz token jest prawidłowy ale tym razem oddzielimy sobie tworzenie tokenów od ich walidacji. W tym celu będziemy korzystać nie z jednego ale z dwóch kluczy:

  • Prywatny (sekretny) – Który będzie wykorzystywany tylko i wyłącznie przez serwer, który będzie tworzył token w celu jego cyfrowego podpisania. Za pomocą prywatnego klucza nie jesteśmy w stanie zwalidować naszego cyfrowego podpisu.
  • Publiczny – Wykorzystywany tylko i wyłącznie do walidacji podpisu. Nie jest możliwe stworzenie podpisu za jego pomocą. Publiczny klucz nie musi być strzeżony ponieważ nawet jeśli atakujący go dostanie to za jego pomocą nie będzie w stanie podrobić podpisu.

W tworzeniu cyfrowego podpisu za pomocą RS256 bierze udział para kluczy RSA. W przypadku algorytmu RSA jeden klucz jest wykorzystywany przy szyfrowaniu danych natomiast drugi klucz jest wykorzystywany do deszyfrowania danych. Należy tutaj zwrócić uwagę na fakt, że mówimy o szyfrowaniu danych co w porównaniu do hashowania jest procesem odwracalnym.

+1 głos
odpowiedź 10 sierpnia 2021 przez PH03NIX Mądrala (6,130 p.)
Key to klucz prywatny znany tylko samemu wydającemu tokeny i służący do weryfikowania wiarygodności.

Sam klucz jest przetwarzany przez funkcję skrótu po to, żeby nikt nie mógł go odzyskać i używać do generowania nowych tokenów.

Samego JWT można łatwo odkodować, ale nie znając klucza (który jest zahashowany) nie jesteśmy w stanie zmienić danych i podszyć się pod zaufane źródło (bo credentials nie będą się zgadzać).

Można też szyfrować także dane zawarte w tokenie, ale to wymaga asymetrycznego algorytmu (2 kluczy - patrz RSA).

Tutaj możesz podejrzeć strukturę tokena i jak się zmienia wraz ze zmienianiem danych:

https://jwt.io/.

A tu pierwsza odpowiedź wyjaśnia rożnicę w szyfrowaniu i samo zjawisko podpisywania tokenów:

https://stackoverflow.com/questions/39239051/rs256-vs-hs256-whats-the-difference
komentarz 10 sierpnia 2021 przez Wiciorny Ekspert (269,120 p.)
trochę tak trochę nie, generalnie token nie powinien zawierać wrażliwych danych - tzn generowany z wrażliwych danych, funkcja skrótu powinna działać o creditionale, ale bez hasła, email itd. Głównie powinno to się opierać na  'loginie'.

Sam token w ogóle to jest  cały PAYLOAD, więc do tego dochodzą też header'y itp, i sygnaturka.

. Podpis tworzy się łącząc zakodowany z wykorzystaniem Base64Url nagłówek i payload za pomocą kropki. Następnie taki string jest hashowany (HS256) lub szyfrowany (RS256) z wykorzystaniem wybranego przez nas algorytmu i sekretnego klucza.

Też dodaje to tylko w ramach uzupełnienia odp twojej, żeby można więcej też doczytac na forum.

Podobne pytania

0 głosów
1 odpowiedź 1,056 wizyt
pytanie zadane 9 kwietnia 2019 w C# przez karol928 Początkujący (320 p.)
0 głosów
0 odpowiedzi 157 wizyt
pytanie zadane 26 maja 2019 w C i C++ przez Krystek102 Bywalec (2,440 p.)
0 głosów
0 odpowiedzi 39 wizyt
pytanie zadane 4 marca w C# przez drewienko Nowicjusz (120 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...