5

Kwestie bezpieczeństwa: Zgodnie z https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/ wiele bibliotek JWT wykorzystuje sam token w celu określenia algorytmu podpisu.Zabezpieczenie tokena internetowego JSON w Web API/MVC 6

To jest nasz przypadek użycia: Chcemy stworzyć mechanizm logowania, który sprawdza użytkownika z twardymi danymi uwierzytelniającymi (nazwa użytkownika/hasło), a następnie zwraca token JWT za pomocą np. 3 dni życia. Token powinien zawierać nazwę użytkownika, a podpis powinien gwarantować, że token nie może zostać "sfałszowany".

Jakiej biblioteki możemy użyć w Web API/MVC 6? Ważne jest, aby algorytm podpisu mógł zostać określony podczas dekodowania, aby uniknąć luki.

Jeśli to możliwe, chcemy uniknąć integracji złożonych komponentów OAuth.

+0

Po prostu trochę googling znalazłem dwie interesujące rzeczy: projekt open source na GitHub - jwt-dotnet: h ttps: //github.com/jwt-dotnet/jwt i JSON Web Token Handler dla Microsoft .NET Framework 4.5 na NuGet: https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/ To spojrzenie tak jak obaj mogą oferować generowanie i zatwierdzanie tokenów JWT, jednak ich nie używałem, – jjczopek

+0

Widziałem je. Nie wiem, czy oferują specyfikację algo na walidację. – Matthias

Odpowiedz

3

Używam biblioteki System.IdentityModel.Tokens.Jwt i właśnie sprawdziłem, czy nie wystąpił ten problem. Wygenerowałem token i zweryfikowałem go w jednym z moich testów, następnie usunąłem signingCredentials, który zmienia alg na none. JWT generowany przy niezauważonej walidacji .

Oto jak ja generowania token:

public string GenerateToken(SSOContext context, SignatureSettings settings) 
{ 
    var token = new JwtSecurityToken(
     issuer: "MyIssuer", 
     audience: "MyAudience", 
     claims: GetClaims(context), 
     //comment the below line to generate a 'none' alg 
     signingCredentials: new X509SigningCredentials(settings.Certificate), 
     notBefore: DateTime.UtcNow, 
     expires: DateTime.UtcNow.AddHours(1) 
     ); 

    return new JwtSecurityTokenHandler().WriteToken(token); 
} 

Kiedy zweryfikować tokenu uzyskać wyjątek zgodnie z oczekiwaniami z komunikatem

IDX10504: Nie można zweryfikować podpis, znak nie mają podpis podpis:

+0

Jak czytałem komentarze w sieci na temat luki, jedynym sposobem, aby być po bezpiecznej stronie byłoby zdefiniowanie oczekiwanego algo na walidacji na stałe. Czy to możliwe w tej bibliotece? Co najmniej nie będzie to podatne na problem braku algo, ponieważ rozumiem twoją odpowiedź. Może możesz potwierdzić lub dodać dodatkowe informacje. – Matthias

+2

Możesz pobrać jwt i przekształcić go w obiekt JwtSecurityToken i sprawdzić właściwość SignatureAlgorithm, aby upewnić się, że jest również zgodny z oczekiwaniami. Jeśli nie, nie możesz nawet zadać sobie trudu sprawdzania poprawności i po prostu go odrzucić. [link] (https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.jwtsecuritytoken (v = vs.114) .aspx) Jeśli coś jest nie tak, proszę dać mi znać. Odpowiadam częściowo, aby sprawdzić, czy ktoś zauważy błąd. – TylerReid

+1

Wszystko to wydaje mi się rozsądne i solidne Myślę, że niedługo przyjmuję twoją odpowiedź. Nie jestem pewien, czy mogę w pełni przetestować, aż skończy się nagroda. Sądzę więc, że muszę to szybko zaakceptować, aby zapobiec utracie nagrody. – Matthias