在Asp.Net Core中使用JWT认证(三) - RSA非对称加密
文章系列目录 |
---|
在Asp.Net Core中使用JWT认证(一) - JWT介绍 |
在Asp.Net Core中使用JWT认证(二) - .Net Core中使用 |
在Asp.Net Core中使用JWT认证(三) - RSA非对称加密 |
在Asp.Net Core中使用JWT认证(四) - 跨语言使用 |
在Asp.Net Core中使用JWT认证(五) - 结束篇 一些常见问题 |
在日常使用中,JWT一般使用对称签名,即一个密钥即签名也验签,这在单系统里没有什么问题,但如果面对分布式系统、第三方系统集成或其他更复杂场景下,就变得不好处理,你是把密钥交出去还是不交出去?交出去就显得不安全而且混乱,所以这里我们还可以使用RSA进行签名,具体为私钥签名,公钥验签。
生成一对公私密钥
下载支付宝密钥生成工具,打开界面如下。密钥长度选RSA2,密钥格式选PKCS1,点击生成密钥,这样就生成了一对密钥。
私钥签名
在认证中心使用私钥来签名token,代码如下。
var privateKey = "你的私钥";
var publicKey = "你的公钥";
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Jti,""),
new Claim(JwtRegisteredClaimNames.Exp,DateTime.Now.AddMinutes(2).ToUniversalTime().ToString(CultureInfo.InvariantCulture), ClaimValueTypes.Integer64)
};
var helper = new RSAHelper(RSAType.RSA2, Encoding.UTF8,privateKey,publicKey);
var rsa = helper.CreateRsaProviderFromPrivateKey(privateKey);
var key = new RsaSecurityKey(rsa);
var credentials = new SigningCredentials(key, SecurityAlgorithms.RsaSha512);
var token = new JwtSecurityToken(
//"https://ut32.com",
//"moz_application",
claims:claims,
expires: DateTime.Now.AddMinutes(2),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
公钥验签
在 startup.cs 中,找到AddJwtBearer
代码处,修改代码如下。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
var publicKey = "你的公钥";
var helper = new RSAHelper(RSAType.RSA2, Encoding.UTF8,null,publicKey);
var rsa = helper.CreateRsaProviderFromPublicKey(publicKey);
var key = new RsaSecurityKey(rsa);
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = key
};
});
}