8

Tôi đang cố tạo phương thức xác thực mã thông báo trả về true nếu mã thông báo JWT hợp lệ dựa trên chữ ký. Tôi không nghĩ rằng tôi thực sự cần phải xác nhận tất cả mọi thứ trong mã thông báo nhưng những gì thực sự có nghĩa là một mã thông báo là hợp lệ sau khi gọi ValidateToken()? Sự tồn tại của một nguyên tắc? Mã thông báo tham chiếu ngoài chứa các giá trị nhất định? Không chắc chắn khi nào trả về đúng từ phương thức này.Khi nào JWTSecurityTokenHandler.ValidateToken() thực sự hợp lệ?

public bool ValidateToken(string tokenString) 
{ 
    var validationParameters = new TokenValidationParameters() 
    { 
     ValidIssuer = "My Company", 
     ValidAudience = ApplicationId, 
     IssuerSigningKey = JsonWebTokenSecretKey 
    }; 

    SecurityToken token = new JwtSecurityToken(); 
    var tokenHandler = new JwtSecurityTokenHandler(); 
    var principal = tokenHandler.ValidateToken(tokenString, validationParameters, out token); 

    return principal != null; 
} 

Trả lời

11

Tôi kiểm tra tất cả giá trị xác nhận quyền sở hữu theo cách thủ công. Tôi đã tìm kiếm một câu trả lời dứt khoát cho cùng một câu hỏi của bạn nhưng điều duy nhất tôi đã thấy là hàm ValidateToken sẽ ném một Ngoại lệ nếu có điều gì đó sai, vì vậy tôi bắt đầu bằng cách kết thúc cuộc gọi trong try-catch và return false from cuộc đuổi bắt.

Đó chỉ là "thẻ đầu tiên" của tôi khi xác thực mã thông báo. Sau đó, tôi nâng một ít nặng hơn để kiểm tra các giá trị nhất định theo cách thủ công. Ví dụ, tôi đảm bảo rằng giá trị unique_name trong phần xác nhận thực sự tồn tại như một người dùng trong cơ sở dữ liệu của tôi, rằng người dùng đã không bị vô hiệu hóa và các công cụ hệ thống độc quyền khác như thế.

public static bool VerifyToken(string token) 
    { 
     var validationParameters = new TokenValidationParameters() 
     { 
      IssuerSigningToken = new BinarySecretSecurityToken(_key), 
      ValidAudience = _audience, 
      ValidIssuer = _issuer, 
      ValidateLifetime = true, 
      ValidateAudience = true, 
      ValidateIssuer = true, 
      ValidateIssuerSigningKey = true 
     }; 

     var tokenHandler = new JwtSecurityTokenHandler(); 
     SecurityToken validatedToken = null; 
     try 
     { 
      tokenHandler.ValidateToken(token, validationParameters, out validatedToken); 
     } 
     catch(SecurityTokenException) 
     { 
      return false; 
     } 
     catch(Exception e) 
     { 
      log(e.ToString()); //something else happened 
      throw; 
     } 
     //... manual validations return false if anything untoward is discovered 
     return validatedToken != null; 
    } 

Dòng cuối cùng, return validatedToken != null, hoàn toàn là mê tín dị đoan về phía tôi. Tôi chưa bao giờ thấy validatedToken được null.

+0

Chào mừng bạn đến với Stack Overflow, Eddie. Xin lưu ý rằng phần câu trả lời chỉ dành cho câu trả lời hoàn chỉnh cho câu hỏi gốc, chứ không phải bình luận. – Celeo

+6

Lời xin lỗi của tôi, tôi nghĩ rằng tôi đã trả lời câu hỏi bằng cách cho thấy rằng bạn đặt thuộc tính xác thực thành true và sau đó bắt ngoại lệ được ném. Có quá nhiều bình luận trong lời giải thích của tôi không? –

+3

Nhìn vào mã nguồn, điều này thực sự có vẻ là trường hợp: ValidateToken sẽ ném vào mã thông báo không hợp lệ. https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/master/src/System.IdentityModel.Tokens.Jwt/JwtSecurityTokenHandler.cs Đây là thiết kế tồi; chúng ta không nên sử dụng các ngoại lệ cho luồng điều khiển. Nhưng, đó là trạng thái của thư viện này ngày nay. –

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