【发布时间】:2021-04-20 12:58:51
【问题描述】:
我的目标是创建一个未加密的签名令牌。我正在像这样生成我的 JWT:
private const string C_ISSUER_SIGNINGKEY = "kXp2s5v8y/B?D(G+KbPeShVmYq3t6w9z";
private const JweAlgorithm JWE_ALGO = JweAlgorithm.DIR;
private const JweEncryption JWE_ENCR = JweEncryption.A128CBC_HS256;
public string GenerateToken(Dictionary<string, object> aPayload, TimeSpan aExpirationTime)
{
var aNowMs = DateTime.Now.ToUniversalTime().Subtract(
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
).TotalMilliseconds;
if (aExpirationTime.TotalMilliseconds > 0)
{
var lExp = aNowMs + aExpirationTime.TotalMilliseconds;
aPayload.Add("exp", lExp);
}
var aSecretKey = Encoding.UTF8.GetBytes(C_ISSUER_SIGNINGKEY);
var aToken = JWT.Encode(aPayload, aSecretKey, JWE_ALGO, JWE_ENCR);
return aToken;
}
当使用这个时,我得到一个像这样的令牌:
var lPayLoad = new Dictionary<string, object>()
{
{ "emailAddress", "peter@email.com" },
{ "password", "password" }
};
var lToken = lEncryptor.GenerateToken(lPayLoad, new TimeSpan(50,50,50,50));
然后我会得到这样的令牌:eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..4lvBJr_Q0X_hj5OL5rdMsA.d0S--Vdm0JDkjYcN1Djnx4KV3DbehzwkHlvDKlFQuAk.DVS5O8zmJr2l1axenk2Fgw
(注意,令牌中的有效负载部分为空)
当我尝试对此进行解码(通过 jwt.Io 或任何其他工具)时,我无法验证签名者,也无法获取有效负载。
我到底做错了什么?
【问题讨论】:
-
这确实是一个没有有效负载的无效令牌,但目前还不清楚您的目标是什么。您的代码的某些部分看起来像您想要创建一个加密令牌 (JWE),但您最终会得到一个无效的 JWS(签名令牌),它的标头中也有一个无效的
algclaim。 -
@jps。谢谢你的评论。我的目标是制作一个未加密的签名令牌。我的印象是 JWT.Encode 只签名,不加密。我对这个假设有误吗?
-
JWT.Encode 似乎对其进行了签名,这是真的,但我想知道实际使用了哪种算法,因为给定的
JWE_ALGO = JweAlgorithm.DIR;对于已签名的令牌没有意义。它通常应该是类似的东西。HS256,或`RS256。您在这里使用哪个库? -
@jps,就是这样!字符串 tokenSigned = JWT.Encode(aPayload, aSecretKey, JwsAlgorithm.HS256);解决了我的问题。我正在使用何塞,顺便说一句。如果您想将此添加为答案,我会接受。
-
@jps。我正在使用 jose-jwt。
标签: c# encryption jwt jose