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

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

此内容仅登录用户可见

4条评论

  • 念往昔丶繁华竞逐

    2019年5月20日

    最后一个五官很漂亮,虽然脸稍微大了一点点,但也算普通人里漂亮的
  • Eleven

    2019年5月20日

    念往昔丶繁华竞逐:
    最后一个五官很漂亮,虽然脸稍微大了一点点,但也算普通人里漂亮的...
    这帖子真的是精品。美中不足的是,为什么要用繁体,虽然能看懂,但有些麻烦呀。
  • SukiU

    2019年5月20日

    我曾在某外企互联网公司工作过一段时间,他们就是那种工作时间聊天摸鱼,下班时间拼命工作,然后加班蹭加班费和补贴😂
微信公众号
站长帮
微信公众号,每日更新!