5

Các mối quan ngại về bảo mật: Theo số https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/, rất nhiều thư viện JWT sử dụng mã thông báo để xác định thuật toán chữ ký.Mã thông báo Web JSON an toàn trong API Web/MVC 6

Đây là trường hợp sử dụng của chúng tôi: Chúng tôi muốn tạo cơ chế đăng nhập xác thực người dùng bằng thông tin đăng nhập khó (tên người dùng/mật khẩu) và sau đó trả về mã thông báo JWT với ví dụ: 3 ngày trọn đời. Mã thông báo phải chứa tên người dùng và chữ ký phải đảm bảo rằng mã thông báo không được "giả".

Bạn có thể sử dụng thư viện nào trong API Web/MVC 6? Điều quan trọng là thuật toán chữ ký có thể được xác định trên giải mã để tránh lỗ hổng.

Nếu có thể, chúng tôi muốn tránh tích hợp các thành phần OAuth phức tạp.

+0

Sau một chút googling tôi đã tìm thấy hai điều thú vị: dự án mã nguồn mở trên GitHub - jwt-dotnet: h ttps: //github.com/jwt-dotnet/jwt và Trình xử lý mã thông báo Web JSON cho Microsoft .NET Framework 4.5 trên NuGet: https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/ Nó trông giống như cả hai người trong số họ có thể cung cấp thế hệ và xác nhận mã thông báo JWT, tuy nhiên tôi đã không sử dụng chúng, – jjczopek

+0

Tôi đã thấy chúng. Tôi không biết nếu họ cung cấp spec.of algo ngày xác nhận. – Matthias

Trả lời

3

Tôi đang sử dụng thư viện System.IdentityModel.Tokens.Jwt và tôi vừa kiểm tra vấn đề này. Tôi tạo ra một mã thông báo và xác nhận nó trong một trong các thử nghiệm của tôi, sau đó tôi loại bỏ các signingCredentials mà thay đổi alg để không. JWT được tạo với "alg":"none"xác thực không thành công.

Dưới đây là cách tôi đang tạo ra các mã thông báo:

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

Khi tôi xác nhận các dấu hiệu tôi nhận được một ngoại lệ như mong đợi với thông điệp

IDX10504: Không thể để xác nhận chữ ký, dấu hiệu không có chữ ký :

+0

Khi tôi đọc các nhận xét trên mạng về lỗ hổng, cách duy nhất để an toàn là xác định bản ngã được mong đợi trên xác nhận mã hóa cứng. Điều này có thể thực hiện với thư viện này không? Ít nhất nó sẽ không dễ bị tổn thương đối với vấn đề không có vấn đề gì khi tôi hiểu câu trả lời của bạn. Có thể bạn có thể xác nhận hoặc thêm thông tin bổ sung. – Matthias

+2

Bạn có thể lấy jwt và biến nó thành một đối tượng JwtSecurityToken và kiểm tra thuộc tính SignatureAlgorithm để đảm bảo nó là những gì được mong đợi. Nếu không, bạn thậm chí không thể làm mất hiệu lực và chỉ từ chối nó. [link] (https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.jwtsecuritytoken (v = vs.114) .aspx) Nếu bạn thấy bất cứ điều gì sai, xin vui lòng cho tôi biết. Tôi trả lời một phần để xem có ai phát hiện lỗi không. – TylerReid

+1

Điều này có vẻ hợp lý và vững chắc với tôi Tôi nghĩ rằng tôi sẽ chấp nhận câu trả lời của bạn rất sớm. Tôi không chắc liệu tôi có thể kiểm tra đầy đủ cho đến khi tiền thưởng kết thúc. Vì vậy, tôi đoán tôi cần phải chấp nhận nó sau đó sớm để ngăn chặn mất giải thưởng. – Matthias

Các vấn đề liên quan