Asp.net core 在.NET core中创建JWT的问题
我正在使用asp.NETCore创建JWT,但有问题 我需要像下面的伪代码那样创建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
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进行编码,这可能是导致问题的原因
我如何:
你能分享你的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。