Używam biblioteki JWT do dekodowania tokenu internetowego Json i chciałbym przełączyć się na oficjalną implementację JWT firmy Microsoft, System.IdentityModel.Tokens.Jwt .
Dokumentacja jest bardzo skąpa, więc trudno jest mi wymyślić, jak wykonać to, co robiłem z biblioteką JWT. W przypadku biblioteki JWT istnieje metoda Decode, która pobiera token JWT zakodowany w standardzie Base64 i przekształca go w JSON, który można następnie deserializować. Chciałbym zrobić coś podobnego za pomocą System.IdentityModel.Tokens.Jwt, ale po długich poszukiwaniach nie mogę dowiedzieć się, jak to zrobić.
Co jest warte, czytam token JWT z pliku cookie do użytku z platformą tożsamości Google.
Każda pomoc będzie mile widziana.
Odpowiedzi:
W pakiecie znajduje się klasa o nazwie,
JwtSecurityTokenHandler
która pochodzi odSystem.IdentityModel.Tokens.SecurityTokenHandler
. W WIF jest to podstawowa klasa do deserializacji i serializacji tokenów zabezpieczających.Klasa ma
ReadToken(String)
metodę, która pobierze ciąg znaków JWT zakodowany w standardzie Base64 i zwróci wartość,SecurityToken
która reprezentuje JWT.Ma
SecurityTokenHandler
równieżValidateToken(SecurityToken)
metodę, która pobieraSecurityToken
i tworzy plikReadOnlyCollection<ClaimsIdentity>
. Zwykle w przypadku tokena JWT będzie to pojedynczyClaimsIdentity
obiekt z zestawem oświadczeń reprezentujących właściwości oryginalnego tokena JWT.JwtSecurityTokenHandler
definiuje kilka dodatkowych przeciążeńValidateToken
, w szczególności maClaimsPrincipal ValidateToken(JwtSecurityToken, TokenValidationParameters)
przeciążenie.TokenValidationParameters
Argumentem pozwala określić certyfikat podpisywania tokenu (jako listaX509SecurityTokens
). Ma również przeciążenie, które traktuje token JWT jakostring
raczej niż plikSecurityToken
.Kod służący do tego jest dość skomplikowany, ale można go znaleźć w kodzie (
TokenValidationHandler
klasie) Global.asax.cx w przykładzie dewelopera o nazwie „ADAL - Natywna aplikacja do usługi REST - Uwierzytelnianie za pomocą usługi ACS za pośrednictwem okna dialogowego przeglądarki”, znajdującej się pod adresemhttp://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc
Alternatywnie
JwtSecurityToken
klasa ma dodatkowe metody, które nie znajdują się wSecurityToken
klasie bazowej , takie jakClaims
właściwość, która pobiera zawarte oświadczenia bez przechodzenia przezClaimsIdentity
kolekcję. Ma równieżPayload
właściwość, która zwracaJwtPayload
obiekt, który pozwala uzyskać surowy kod JSON tokenu. To zależy od scenariusza, które podejście jest najbardziej odpowiednie.Ogólna (tzn. Nie związana z JWT) dokumentacja dla
SecurityTokenHandler
klasy znajduje się pod adresemhttp://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.aspx
W zależności od aplikacji można skonfigurować procedurę obsługi JWT w potoku WIF dokładnie tak, jak każdą inną procedurę obsługi.
Istnieją 3 próbki tego używanego w różnych typach zastosowań pod adresem
http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=SearchText&f%5B0%5D.Value=aal&f%5B1%5D.Type=User&f%5B1%5D.Value=Azure% 20AD% 20Developer% 20Experience% 20Team & f% 5B1% 5D.Text = Azure% 20AD% 20Developer% 20Experience% 20Team
Prawdopodobnie jeden będzie odpowiadał Twoim potrzebom lub przynajmniej da się do nich dostosować.
źródło
Zastanawiam się tylko, po co w ogóle używać niektórych bibliotek do dekodowania i weryfikacji tokenu JWT.
Zakodowany token JWT można utworzyć za pomocą następującego pseudokodu
Jest to bardzo łatwe bez żadnej konkretnej biblioteki. Używając następującego kodu:
Dekodowanie tokena jest odwróconą wersją powyższego kodu. Aby zweryfikować podpis, należy wykonać ten sam i porównać część podpisu z podpisem obliczonym.
AKTUALIZACJA: Dla tych, którzy zmagają się z kodowaniem / dekodowaniem base64 urlsafe, zobacz inne pytanie SO , a także wiki i RFC
źródło