Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成JWS时清空有效负载_C#_Encryption_Jwt_Jose - Fatal编程技术网

C# 生成JWS时清空有效负载

C# 生成JWS时清空有效负载,c#,encryption,jwt,jose,C#,Encryption,Jwt,Jose,我的目标是创建一个未加密的签名令牌。我正在生成我的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; p

我的目标是创建一个未加密的签名令牌。我正在生成我的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));
private const string C_ISSUER_SIGNINGKEY=“kXp2s5v8y/B?D(G+KbPeShVmYq3t6w9z”;
私有常量JweAlgorithm JWE_ALGO=JweAlgorithm.DIR;
私人建筑JweEncryption JWE_ENCR=JweEncryption.A128CBC_HS256;
公共字符串GenerateToken(字典aPayload,TimeSpan AEExpirationTime)
{
var aNowMs=DateTime.Now.ToUniversalTime().Subtract(
新的日期时间(1970,1,1,0,0,0,DateTimeKind.Utc)
).总毫秒;
如果(aExpirationTime.TotalMillistics>0)
{
var lExp=aNowMs+aExpirationTime.total毫秒;
aPayload.Add(“exp”,lExp);
}
var aSecretKey=Encoding.UTF8.GetBytes(C_ISSUER_SIGNINGKEY);
var aToken=JWT.Encode(aPayload、aSecretKey、JWE\u ALGO、JWE\u ENCR);
返回阿托肯;
}
当使用此标记时,我会得到如下标记:

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));
var lPayLoad=newdictionary()
{
{“电子邮件地址”peter@email.com" },
{“密码”,“密码”}
};
var lToken=lEncryptor.GenerateToken(lPayLoad,新的时间跨度(50,50,50,50));
然后我会得到这样一个令牌:
eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..4lvBJr_Q0X_hj5OL5rdMsA.d0S--Vdm0JDkjYcN1Djnx4KV3DbehzwkHlvDKlFQuAk.DVS5O8zmJr2l1axenk2Fgw

(注意,令牌中的有效负载部分为空)

当我尝试解码(通过jwt.Io或任何其他工具)时,我无法验证签名者,也无法获得有效负载


我到底做错了什么?

在您的代码中,您对签名令牌(JWS)使用了错误的算法类型

在这种情况下,
JWE\u ENCR
参数也是错误的

对于使用创建的JWS,您需要选择适当的签名算法,例如:

 JwsAlgorithm.HS256

等等()

如果将行更改为:

JWT.Encode(aPayload, aSecretKey, JwsAlgorithm.HS256);

它应该可以正常工作。

这确实是一个没有有效负载的无效令牌,但还不清楚您的目标是什么。代码的某些部分看起来像是要创建一个加密令牌(JWE),但最终得到了一个无效的JWS(签名令牌)标题中还有一个无效的
alg
声明。@jps。谢谢你的评论。我的目标是制作一个未加密、已签名的令牌。我的印象是JWT。Encode只对其进行签名,而不是加密。我的假设不正确吗?JWT.Encode似乎对其进行了签名,这是真的,但我想知道实际使用的是哪种算法,正如给定的那样
JWE_ALGO=JweAlgorithm.DIR;
对于签名令牌没有任何意义。它通常应该是类似于
HS256
或`RS256.您在这里使用的是哪个库?@jps,就是它!string tokenSigned=JWT.Encode(aPayload,aSecretKey,JwsAlgorithm.HS256);解决了我的问题。我正在使用jose,顺便说一句。如果您想添加此作为答案,我将接受它。@jps。我正在使用jose jwt。