5

Güvenlik ile ilgili endişeler: https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/'a göre bir çok JWT kitaplığı imza için algoritmayı belirlemek amacıyla belirtecin kendisini kullanır.Web API'sinde güvenli JSON Web Jetonu/MVC 6

Bu bizim kullanım durumumuz: Bir kullanıcı için sert kimlik bilgilerini (kullanıcı adı/parola) doğrulayan ve ardından bir JWT jetonunu döndüren bir oturum açma mekanizması oluşturmak istiyoruz. 3 gün ömür boyu. Simge, kullanıcı adını içermeli ve bir imza, belirtecin "taklit edilemeyeceğini" garanti etmelidir.

Web API/MVC 6'da hangi kütüphaneyi kullanabiliriz? Güvenlik açığından kaçınmak için imza algoritmasının kod çözmede belirtilmesi önemlidir.

Mümkünse, karmaşık OAuth bileşenlerini entegre etmekten kaçınmak isteriz.

+0

Sadece birazcık uğraştıktan sonra iki ilginç şey buldum: GitHub'da açık kaynak projesi - jwt-dotnet: h ttps: //github.com/jwt-dotnet/jwt ve NuGet'teki Microsoft .NET Framework 4.5 için JSON Web Token İşleyicisi: https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/ Her ikisi de JWT tokenlerinin üretilmesini ve onaylanmasını sağlayabilir, ancak onları kullanmadım, – jjczopek

+0

Bunları gördüm. Doğrulamada algo özelliği sunup sunmadıklarını bilmiyorum. – Matthias

cevap

3

System.IdentityModel.Tokens.Jwt kitaplığını kullanıyorum ve yalnızca bu sorun için kontrol ettim. Bir belirteç ürettim ve testlerimden birinde doğruladım, daha sonra alg'ı hiçbiri olarak değiştirmeyen signingCredentials'u kaldırdım. "alg":"none"ile oluşturulan JWT doğrulaması başarısız oldu. imzayı doğrulanamadı, belirteç değildir: Ben belirteci doğrulamak zaman

IDX10504 mesajla beklendiği gibi

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); 
} 

istisna almak: Burada

ben kod oluşturduktan am nasıl imzası:

+0

Güvenlik açığı ile ilgili net yorumları okuduğumda, güvenli tarafta olmanın tek yolu, kodlanmış doğrulama üzerinde beklenen algoyu tanımlamak olacaktır. Bu kütüphaneyle mümkün mü? En azından cevabınızı anladığım kadarıyla algo sorununa karşı savunmasız kalmaz. Belki onaylayabilir veya ek bilgi ekleyebilirsiniz. – Matthias

+2

jwt'yi alıp JwtSecurityToken nesnesine dönüştürebilir ve SignatureAlgorithm özelliğini de kontrol edebilirsiniz. Eğer değilse, doğrulama yapmaya bile zahmet edemezsiniz ve sadece reddedebilirsiniz. [link] (https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.jwtsecuritytoken (v = vs.114) .aspx) Yanlış bir şey görürseniz lütfen bana bildirin. Birinin bir hata tespit edip etmediğini kısmen yanıtlıyorum. – TylerReid

+1

Tüm bunlar bana mantıklı ve sağlam görünüyor. Cevabınızı çok yakında kabul edeceğimi düşünüyorum. Ödül bitene kadar test edebilecek miyim emin değilim. Öyleyse ödülü kaybetmemek için yakında kabul etmem gerekiyor sanırım. – Matthias