Witam,
Od niedawna rozpoznaję temat zarządzania użytkownikami w .NET Core web api. Muszę przyznać, że ta platforma ma bardzo fajny system autoryzacji autentykacji użytkowników. Implementacja podstawowych funkcjonalności jak rejestracja, logowanie i generowanie tokena JWT nie stanowi problemu, gdyż jest dużo informacji na ten temat. Obecnie borykam się z czymś innym, muszę rozpoznać dwa procesy, na temat których nie potrafię znaleźć informacji. Może któryś z forumowiczów zna odpowiedź na te pytania.
- Dodaje nowego użytkownika do bazy danych. W żądaniu podaje hasło jako plain tekst. Później wywołuję metodę CreateAsync i w bazie znajduje się hash hasła:
var result = await _userManager.CreateAsync(user, registerUser.Password);
Pytanie: jak generowany jest hash, jaki algorytm jest do tego użyty?
- Przy logowaniu generuję tokena dla klienta:
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("KLUCZ_SEKRETNY_O_ODPOWIEDNIEJ_DLUGOSCI");
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer ......
......
signingCredentials: creds
);
return token; // Żeby sprawdzić co się znajduje w tokenie
Oto co między innymi znajduje się w środku
.....
"signingCredentials":{
"algorithm": "HS256",
"cryptoProviderFactory": null,
"key":{
"keySize": 200,
"key": "SEpSRV9XSUxYX0JFX0FfU0VDUkKUX0tFWm==",
"keyId": null,
"cryptoProviderFactory":{
"customCryptoProvider": null
}
},
"kid": null
},
"encryptingCredentials": null,
"signingKey": null,
.....
Oczywiście po wywołaniu poniższej funkcji otrzymuję normalnego tokena składającego się z trzech części
return new JwtSecurityTokenHandler().WriteToken(token);
Pytanie: jak może klient sprawdzić (a taki jest wymóg) autentyczność tokena? Jak rozumiem, musi on znać algorytm i klucz według których nagłówek i payload zostały zapisane w sygnaturze. Algorytm jest znany, ale co jest w tym przypadku kluczem: KLUCZ_SEKRETNY_O_ODPOWIEDNIEJ_DLUGOSCI", czy "key": "SEpSRV9XSUxYX0JFX0FfU0VDUkKUX0tFWm==", a może jeszcze coś innego?
Update:
Ten token jest na serwerze sprawdzany za każdym razem, gdy tylko ktoś wysyła żądanie opatrzone [Authorize]. A teraz chciałbym po prostu znać ten klucz i taką samą weryfikację zrobić u klienta.
Pozdrawiam,