2016-11-16 6 views
2

.NETでJWTトークンを生成しようとしています。最初は "System.IdentityModel.Tokens.Jwt"を使用しようとしましたが、トークンの検証中に問題が発生していたので、 "jose-jwt"に切り替えました。私は、コードのこの作品でトークンを作成し、検証することができますにもかかわらず:私は、サイト「https://jwt.io/」で生成されたトークンをテストしようとすると、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; 

} 

を私は問題があります。実際には、生成されたトークンをコピー/ペーストし、キーとして「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はより直感的だと思われますが、もう1つはMicrosoftによって作られており、多くの例がありますので...私はjose-jwtに行くと問題であるかどうか疑問に思っていましたか? – ssougnez

+1

@ssougnez「jose-jwt」は一度も聞いたことがありません。 https://jwt.io/を見ると、jose-jwtにはいくつかの脆弱性があることがわかります(トークンを確認した後に少しスクロールします)。 'System.IdentityModel.Tokens.Jwt'には3つの脆弱なアルゴリズムがありますが、HS256を使うとうまくいくでしょう。 – Rob

+0

申し訳ありません、ありがとうございます。 Btw、私がSystem.IdentityModel.Tokens.Jwtで持っていた問題は、2つの異なるものから来ていました。バイトキー(あなたが指摘しているように)を取得する方法と、DateTimeで定義していた「iat」の主張int。だからデコード中に失敗していました。ありがとう – ssougnez

関連する問題