Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core 在.NET core中创建JWT的问题_Asp.net Core_Jwt - Fatal编程技术网

Asp.net core 在.NET core中创建JWT的问题

Asp.net core 在.NET core中创建JWT的问题,asp.net-core,jwt,Asp.net Core,Jwt,我正在使用asp.NETCore创建JWT,但有问题 我需要像下面的伪代码那样创建JWT: var headers = base64URLencode(HeaderData); var payload = base64URLencode(payloadData); var headerwithpayload = header + "." + payload; var signature = base64URLencode(RSASHA256(headerwithpaylo

我正在使用asp.NETCore创建JWT,但有问题

我需要像下面的伪代码那样创建JWT:

var headers = base64URLencode(HeaderData);
var payload = base64URLencode(payloadData);
var headerwithpayload = header + "." + payload;
 
var signature = base64URLencode(RSASHA256(headerwithpayload, privateKey));
 
var encodedJWT = headerwithpayload + "." + signature;
为了实现这一点,我们创建了带有密码的公共X509证书(.cer)和私有证书(.pfx)。用于创建JWT的算法是RS256

下面的代码是为创建JWT而编写的,当我在中使用我的公共证书验证JWT时,它显示为一个有效签名。但是,当我将其发送给需要处理我的请求的其他团队时,我得到了一个401-未经授权的错误

         // Certificate & Private Key            
         string certLocation = @"E:\PrivateCert.pfx";
         string certPassword = "####";
         var colln = new X509Certificate2collection();
         colln.Import(certLocation, certPassword, X509KeyStorageFlags.PersistKeySet);
         var certificate = colln[0];
         var privateKey = certificate.GetRSAPrivateKey();
         var privateSecurityKey = new RsaSecurityKey(privateKey);

        // Header, Payload & Signature
        var descriptor = new SecurityTokenDescriptor
        {
            Issuer = "ClientId",
            Audience = "audience",
            Expires = DateTime.UtcNow.AddMinutes(10),
            Subject = new ClaimsIdentity(new List<Claim> { new Claim("sub", "subject") }),
            SigningCredentials = new SigningCredentials(privateSecurityKey, SecurityAlgorithms.RsaSha256)
        };

        var tokenHandler = new JsonWebTokenHandler();         
        string jwtValue = tokenHandler.CreateToken(descriptor);
//证书和私钥
字符串certLocation=@“E:\PrivateCert.pfx”;
字符串certPassword=“#####”;
var colln=新的X509Certificate2collection();
colln.Import(certLocation、certPassword、X509keystrageFlags.PersistKeySet);
var证书=colln[0];
var privateKey=certificate.GetRSAPrivateKey();
var privateSecurityKey=新的RsaSecurityKey(privateKey);
//标题、有效载荷和签名
var descriptor=新的SecurityTokenDescriptor
{
Issuer=“ClientId”,
观众=“观众”,
Expires=DateTime.UtcNow.AddMinutes(10),
主题=新的索赔实体(新列表{新的索赔(“子”、“主题”)}),
SigningCredentials=新的SigningCredentials(privateSecurityKey、SecurityAlgorithms.rsasa256)
};
var tokenHandler=new JsonWebTokenHandler();
字符串jwtValue=tokenHandler.CreateToken(描述符);
我知道我不是第二次使用签名对JWT进行编码,这可能是导致问题的原因

我如何:

  • 创建编码的JWT
  • 将私有证书中的私钥提取为字符串,这样我就可以像伪代码一样创建编码的JWT

  • 你能分享你的startup.cs吗?你是否设置了
    ValidateSuersigningKey=true
    ,你的
    IssuerSigningKey
    是否与
    privateSecurityKey
    相同?嗨@yiyiyiyiyou,我只在控制器中使用JWT。我将把JWT发送到另一个外部API(有我的公共证书)以获取信息。那么,在启动过程中有什么需要做的改变吗?我问题中的代码包含我使用过的完整代码,但我没有使用ValidateSuersigningKey。我指的是外部API中的startup.cs。在外部API中,您需要将
    IssuerSigningKey
    设置为与
    privateSecurityKey
    相同。我无法更改外部API,因为它属于另一个团队。此外,他们使用Java进行开发。他们有我发给他们的X509公共证书,以阅读我将要发送的JWT。所以我需要做的就是创建一个类似于我上面问题中提到的伪代码的JWT。你能分享你的startup.cs吗?你是否设置了
    ValidateSuersuingKey=true
    ,你的
    IssuersuingKey
    privateSecurityKey
    相同?嗨@yiyiyiyou,我只在控制器中使用JWT。我将把JWT发送到另一个外部API(有我的公共证书)以获取信息。那么,在启动过程中有什么需要做的改变吗?我问题中的代码包含我使用过的完整代码,但我没有使用ValidateSuersigningKey。我指的是外部API中的startup.cs。在外部API中,您需要将
    IssuerSigningKey
    设置为与
    privateSecurityKey
    相同。我无法更改外部API,因为它属于另一个团队。此外,他们使用Java进行开发。他们有我发给他们的X509公共证书,以阅读我将要发送的JWT。所以我所需要做的就是创建一个类似于上面问题中提到的伪代码的JWT。