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

ASP.NET Core JWT Tokens

+1 głos
979 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 (281,250 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 (281,250 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,344 wizyt
pytanie zadane 9 kwietnia 2019 w C# przez karol928 Początkujący (320 p.)
0 głosów
0 odpowiedzi 297 wizyt
pytanie zadane 26 maja 2019 w C i C++ przez Krystek102 Bywalec (2,440 p.)
0 głosów
0 odpowiedzi 175 wizyt
pytanie zadane 4 marca 2024 w C# przez drewienko Nowicjusz (120 p.)

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...