Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.NET:RS256签名JWT中的签名无效_.net_Jwt_Digital Signature - Fatal编程技术网

.NET:RS256签名JWT中的签名无效

.NET:RS256签名JWT中的签名无效,.net,jwt,digital-signature,.net,Jwt,Digital Signature,我需要创建一个Json Web令牌,并使用asymetric对其进行签名 RS256算法。用于签名的密钥应取自 X509证书并由接收方使用公钥进行验证 使用HMAC和密码可以很好地工作,但是JWT是用代码创建的 如下所列,在以下位置生成constantlyI“无效签名” 我在这里浏览了很多帖子,找到了很多有用的提示,但都没有解决我的问题。也许我在理解上还有问题 我知道,包System.IdentityModel.Tokens.Jwt实际上提供了我所需要的一切, 但我想知道我做错了什么

我需要创建一个Json Web令牌,并使用asymetric对其进行签名 RS256算法。用于签名的密钥应取自 X509证书并由接收方使用公钥进行验证

使用HMAC和密码可以很好地工作,但是JWT是用代码创建的 如下所列,在以下位置生成constantlyI“无效签名”

我在这里浏览了很多帖子,找到了很多有用的提示,但都没有解决我的问题。也许我在理解上还有问题

我知道,包System.IdentityModel.Tokens.Jwt实际上提供了我所需要的一切, 但我想知道我做错了什么

        // Get certificate from local store
        X509Store store = new X509Store(StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
        X509Certificate2 x509Cert = (from X509Certificate2 c in store.Certificates where c.SubjectName.Name == $"CN={userName}" select c).First();

        if (x509Cert == null)
        {
            return string.Empty;
        }

        // Setup header
        var header = new { typ = "JWT", alg = "RS256" };
        var headerEncoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header)));

        // Setup payload/claims
        var payload = new
        {
            unique_name = $"{userName}@myCompany.com",
            role = "User",
            iss = x509Cert.Issuer,
            aud = "https://dev.myCompany.com",
            nbf = (Int32)DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds,
            exp = (Int32)DateTime.Now.AddMinutes(5).Subtract(new DateTime(1970, 1, 1)).TotalSeconds,
            jti = Guid.NewGuid(),
            x5t = x509Cert.Thumbprint
        };
        var payloadEncoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload)));

        // ... and sign, using the RSACertificateExtensions
        var rsa = x509Cert.GetRSAPrivateKey();
        var signed = rsa.SignData(Encoding.UTF8.GetBytes($"{headerEncoded}.{payloadEncoded}"), 
                                     HashAlgorithmName.SHA256, 
                                     RSASignaturePadding.Pss);

        var signatureEncoded = Convert.ToBase64String(signed);

        return $"{headerEncoded}.{payloadEncoded}.{signatureEncoded}";
    }

生成令牌时出现一些错误:

  • 对于
    RS256
    使用
    rsasignatureadding.Pkcs1
    而不是
    rsasignatureadding.Pss

  • 需要的是base64url编码,而不是base64。更改
    Convert.tobase64字符串(字节)



使用
static readonly char[]padding={'='}请参见

抱歉,跳过了第一行代码公共静态字符串创建(字符串用户名){您可以单击编辑(就在您的问题下方)编辑您的问题并添加缺少的行。然后您还可以删除您的评论。
 Convert.ToBase64String(bytes)
       .TrimEnd(padding).Replace('+', '-').Replace('/', '_');