Asp.NetCore安全验证之JWT

   本文只是介绍了下基于AspNetCore自带的System.IdentityModel.Tokens.Jwt.dll工具在项目中Token的应用。

我这里谈到的很浅显就两点:

一,超时时间

二,数据的加载

1,废话不多说上代码,首先是自定义的载体类如下

1   public class DtoRecLogin
2     {
3         public string Data1 { get; set; }
4         public string Data2 { get; set; }
5         public string Data3 { get; set; }
6     }

2,接着是Token生成的签名信息

public class TokenAuthOption
    {
        public static string Audience { get; } = "ExampleAudience";
        public static string Issuer { get; } = "ExampleIssuer";
        public static RsaSecurityKey Key { get; } = new RsaSecurityKey(RSAKeyHelper.GenerateKey());
        public static SigningCredentials SigningCredentials { get; } = new SigningCredentials(Key, SecurityAlgorithms.RsaSha256Signature);

        public static TimeSpan ExpiresSpan { get; } = TimeSpan.FromMinutes(1440);
    }

3,好了准备工作完成接着贴上生成Token的代码

 1 private static string GenerateToken(DtoRecLogin reclogin, DateTime expires)
 2         {
 3             var handler = new JwtSecurityTokenHandler();
 4 
 5             ClaimsIdentity identity = new ClaimsIdentity(
 6                 new GenericIdentity(reclogin.Data1, "TokenAuth"),
 7                 new[] {
 8             new Claim("ID", reclogin.Data2),
 9             new Claim("SysCode",reclogin.Data3)
10                 }
11             );
12 
13             var securityToken = handler.CreateToken(new SecurityTokenDescriptor
14             {
15                 Issuer = TokenAuthOption.Issuer,
16                 Audience = TokenAuthOption.Audience,
17                 SigningCredentials = TokenAuthOption.SigningCredentials,
18                 Subject = identity,
19                 Expires = expires
20             });
21             return handler.WriteToken(securityToken);
22         }

这个方法有2个参数

1)DtoRecLogin对象用于承载需要传递的信息

2)  expires 是Token的超时时间

4,Token生成完毕我们来模拟下调用和解析Token

 

 public static void Main(string[] args)
        {
            #region 生成Token
            var timeout = DateTime.Now + TimeSpan.FromSeconds(5);
            var token = GenerateToken(new DtoRecLogin()
            {
                Data1 = "TestData1",
                Data2 = "TestData2",
                Data3 = "TestData3"
            }, timeout);
            #endregion


            #region 解析Token
            //当前的时间戳用于判断token是否过期
            var now = Math.Round((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);

            var encodedJwt = new JwtSecurityTokenHandler().ReadJwtToken(token);
            //开始时间
            var iat = Convert.ToDouble(encodedJwt.Claims.FirstOrDefault(u => u.Type == "iat").Value);
            //结束时间
            var exp = Convert.ToDouble(encodedJwt.Claims.FirstOrDefault(u => u.Type == "exp").Value);

            //如果当前时间戳不再Token声明周期范围内,则返回Token过期
            if (!(iat < now && now < exp))
            {
                throw (new Exception() { Source = "TokenTimeOut" });
            }

            var data1 = encodedJwt.Claims.FirstOrDefault(u => u.Type == "unique_name").Value;
            var data2 = encodedJwt.Claims.FirstOrDefault(u => u.Type == "ID").Value;
            var data3 = encodedJwt.Claims.FirstOrDefault(u => u.Type == "SysCode").Value;
            #endregion

           
        }

 

注释的很详细就不多说了,为了方便的测试我用了5秒钟超时,在调试的时候 可以在

 var now = Math.Round((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);
打上断点,然后一次直接跳过此处,一次等待5秒以上在往下走,可以发现超过5秒会抛Token过期异常

好了,到此结束,希望可以帮到刚接触Token验证的朋友。

 

转载于:https://www.cnblogs.com/liuqi-chu/p/10374586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值