2016-11-16 157 views
2

我想在.NET中生成JWT令牌。起初,我嘗試使用「System.IdentityModel.Tokens.Jwt」,但它在令牌驗證期間導致問題,所以我切換到「jose-jwt」。儘管我可以創建和驗證着這片碼令牌:使用jose-jwt和jwt.io生成的JWT令牌

private byte[] GetBytes(string str) 
{ 
    byte[] bytes = new byte[str.Length * sizeof(char)]; 
    Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 
    return bytes; 
} 

public string Login(LoginInformation credential) 
{ 
    var payload = new Dictionary<string, object>() 
    { 
     { "sub", "[email protected]" }, 
     { "exp", 1300819380 } 
    }; 

    var secretKey = GetBytes("myawesomekey"); 

    string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256); 

    string json = JWT.Decode(token, secretKey); 

    return json; 

} 

我有一個問題,當我嘗試測試與網站「https://jwt.io/」生成的令牌。事實上,我複製/粘貼生成的令牌,我輸入「myawesomekey」作爲密鑰,但它一直告訴我「無效簽名」。

我可以忽略它(因爲我的C#代碼的解碼工作),但我很好奇,我想知道如何通過網站解碼失敗。我唯一的想法是,在C#代碼中,我必須將密鑰作爲字節數組傳遞,所以也許只是將「myawesomekey」傳遞給該網站是無效的。

回答

3

你得到字節錯誤的關鍵:

var payload = new Dictionary<string, object>() 
{ 
    { "sub", "[email protected]" }, 
    { "exp", 1300819380 } 
}; 

var secretKey = Encoding.UTF8.GetBytes("myawesomekey"); 

string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256); 
return token; 

工作正常。這大概是你的問題的原因與System.IdentityModel.Tokens.Jwt

+0

好吧,我可以得到這兩個實現工作感謝您的答案。謝謝。但是,我有一個小問題。哪個圖書館是最好的?在我看來,jose-jwt是比較直接的,但另一個是由微軟製作的,很多例子都是用它製作的,所以......我只是想知道如果我選擇jose-jwt是否是個問題? – ssougnez

+1

@ssougnez我從未使用過或聽說過「jose-jwt」。看看https://jwt.io/ - 它顯示jose-jwt有幾個漏洞(在驗證令牌後向下滾動一下)。 'System.IdentityModel.Tokens.Jwt'有三個易受攻擊的算法,但是當使用HS256時,你會沒事的。 – Rob

+0

好吧,非常感謝。順便說一句,我有System.IdentityModel.Tokens.Jwt的問題來自2個不同的東西:得到字節鍵的方式(正如您指出的),還有「iat」聲稱我在DateTime上定義而不是INT。所以在解碼過程中失敗了。謝謝 – ssougnez