• 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
133 wizyt
pytanie zadane 20 lipca 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 przez Wiciorny Mędrzec (187,550 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 przez PH03NIX Bywalec (2,840 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 przez Wiciorny Mędrzec (187,550 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ź 659 wizyt
pytanie zadane 9 kwietnia 2019 w C# przez karol928 Początkujący (320 p.)
0 głosów
0 odpowiedzi 91 wizyt
pytanie zadane 26 maja 2019 w C i C++ przez Krystek102 Bywalec (2,440 p.)
0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 30 czerwca w C# przez reaktywny Nałogowiec (27,720 p.)

85,852 zapytań

134,629 odpowiedzi

298,887 komentarzy

56,719 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 807p. - rucin93
  2. 806p. - nidomika
  3. 806p. - CC PL
  4. 803p. - Whistleroosh
  5. 761p. - adrian17
  6. 754p. - Michal Drewniak
  7. 751p. - Mikbac
  8. 747p. - Mateusz Bogdan
  9. 686p. - Argeento
  10. 683p. - tokox
  11. 649p. - ScriptyChris
  12. 642p. - s. Dorota Kowalewska
  13. 609p. - Vinox
  14. 601p. - Marcin Harasimowicz
  15. 551p. - TheLukaszNs
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...