在Asp.Net Core中使用JWT认证(三) - RSA非对称加密

作者 the7
发布于 2020年01月23日
评论 0
浏览 423
文章系列目录
在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
        };
    });
}

此内容仅登录用户可见

2条评论

请先登录后发表评论
提交评论
  • WxMp_1502

    2020-09-28 10:18

    RSAHelper可以贴出来看一下吗

  • WxMp_1503

    2020-10-12 10:23

    同求RSAHelper,自己实现了好多个 方法都无法验签

标签云
css (1) less calc (1) C# (4) C#进制转换 (1) asp.net core (8) Authentication (1) 注销 (1) 登录 (1) 验证 (1) scroll-view (1) 微信小程序 (4) 滚动到底部 (1) StackExchange.Redis (1) google (1) 百度 (1) nginx (2) 大文件 (2) 微信小程序c#解密 (1) 微信小程序获取手机号 (1) openid (1) session_key (1) CDN (1) URL鉴权 (1) 阿里云 (1) async (1) await (1) 禁止下拉上滑效果 (1) Index类型 (1) Range类型 (1) dontent publish (1) dotnet publish在线生成器 (1) System.DrawingCore.GDIPlus报错 (1) centos (1) 中文字体 (1) SqlBulkCopy (1) SqlSugar (1) JWT (5) 认证 (3) RSA JWT (1) 非对称加密 (1) 写信 (1) 见字如面 (1) 优化建议 (2) 正确操作字符串 (1) Java (1) JWT退出 (1) RefreshToken (1) .NET Core网站开发框架 (1) Moz (3) 墨子 (1) JSON.NET (1) Newtonsoft (1) System.Text.Json (1) 自定义后台路径 (1) .netcore (1) quartz (2) 作业调度框架 (1) 作业调度 (1) 定时任务 (1) exception (1) 异常处理 (1) HttpClient (1) IHttpClientFactory (1) RDM (1) Redis (1) Redis Desktop Manager (1) RedisDesktopManager (1) linux (1) mac (1) windows (1) Could not get any response (1) postman (1) leetcode (2) 力扣 (1) 回文字符串 (1) 面试刷题 (1) centos7 (1) php安装 (1) 网易云插件 (1) 马甲App (1) Discuz插件 (1) 网易云音乐 (1) Blazor (1) 五子棋 (1) c#解题 (1) 最长连续序列 (1) Swagger (1) 在线文档 (1) blob (1) mp4 (1) 视频 (1) big file (1) 上传 (1) s (1) Azure (1) Azure Key Vault (1) Configuration (1) 密钥保管库 (1) Dapper安装 (1) Dapper是什么 (1) Dapper连接Mysql (1) Dapper连接SqlServer (1) dapper (1)