【第三十一篇】JWT创建Token

该博客介绍了JWT(JSON Web Token)的使用,包括创建和验证JWT令牌的过程。通过`JWTHelper`类,开发者可以创建包含用户信息如SessionID、UserID、登录IP和过期时间的令牌,并将其通过Ajax请求头发送。在服务器端,通过`TokenVerification`方法检查请求头中的令牌有效性,确保安全性。
摘要由CSDN通过智能技术生成

 

类库先安装JWT的包,看下面的图

//创建Token
var token = JWTHelper.Create<JWTToken>(new JWTToken
            {
                SessionID =  Guid.NewGuid().ToString("N"),
                UserID = user.ID,
                LoginIP = WebHelper.GetIP(),
                LoginAt = DateTime.Now,
                ExpiryAt = DateTime.Now.AddDays(1)
            });
$.ajax({
     type: "POST",
     contentType: "application/json",
     beforeSend: function (xrh) {
         xrh.setRequestHeader("token", token);
     },
     data: data
});
JWTToken jwtToken = TokenVerification(actionContext);

        /// <summary>
        /// Token令牌验证
        /// </summary>
        /// <param name="actionContext"></param>
        /// <returns></returns>
        private JWTToken TokenVerification(HttpActionContext actionContext)
        {
            // 获取token
            var luck_api_token = GetApiToken(actionContext);
            if (!string.IsNullOrEmpty(luck_api_token))
            {
                JWTToken jwtToken = JWTHelper.Get<JWTToken>(luck_api_token);
                if (jwtToken != null)
                {
                    return jwtToken;
                }
                else
                {
                    throw new CustomValidException("无效令牌", "-1");
                }
            }
            else
            {
                throw new CustomValidException("无效令牌", "-1");
            }
        }
        /// <summary>
        /// Header获取健值
        /// </summary>
        /// <param name="actionContext"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        private string GetHeaderValues(HttpActionContext actionContext, string key)
        {
            IEnumerable<string> values;
            actionContext.Request.Headers.TryGetValues(key, out values);
            if (values != null && values.Any())
            {
                return values.FirstOrDefault();
            }
            else
                return null;
        }
        /// <summary>
        /// 获取AccessToken值
        /// </summary>
        /// <param name="actionContext"></param>
        /// <returns></returns>
        private string GetApiToken(HttpActionContext actionContext)
        {
            return GetHeaderValues(actionContext, "token");
        }
<!-- Jwt 默认key-->
<add key="TokenSecret" value="jwt_key_2000_01_01"/>
public class JWTHelper
    {
        private readonly static string TOKEN_SECRET = ConfigurationManager.AppSettings["TokenSecret"].ToString();

        /// <summary>
        ///  创建token票据
        /// </summary>
        public static string Create(Dictionary<string, object> payload, string secret = "")
        {
            secret = string.IsNullOrWhiteSpace(secret) ? TOKEN_SECRET : secret;

            IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
            IJsonSerializer serializer = new JsonNetSerializer();
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
            var token = encoder.Encode(payload, secret);

            return token;
        }

        /// <summary>
        ///  创建token票据
        /// </summary>
        public static string Create<T>(T model, string secret = "") where T : JWTToken
        {
            secret = string.IsNullOrWhiteSpace(secret) ? TOKEN_SECRET : secret;

            if (string.IsNullOrWhiteSpace(model.SessionID))
            {
                return "";
            }

            IJsonSerializer serializer = new JWTJsonSerializer();
            IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
            var token = encoder.Encode(model, secret);
            return token;
        }

        /// <summary>
        /// 配置
        /// </summary>       
        private static IJwtDecoder Decoder()
        {
            IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
            IJsonSerializer serializer = new JsonNetSerializer();
            IDateTimeProvider provider = new UtcDateTimeProvider();
            IJwtValidator validator = new JwtValidator(serializer, provider);
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
            return decoder;
        }

        /// <summary>
        /// 返回token ->Json 键值对
        /// </summary>
        public static string Get(string token, string secret = "")
        {
            secret = string.IsNullOrWhiteSpace(secret) ? TOKEN_SECRET : secret;
            IJwtDecoder decoder = Decoder();
            var json = decoder.Decode(token, secret, verify: true);
            return json;
        }

        /// <summary>
        ///  获取token票据 解密实体
        /// </summary>
        public static T Get<T>(string token, string secret = "") where T : JWTToken
        {
            try
            {
                secret = string.IsNullOrWhiteSpace(secret) ? TOKEN_SECRET : secret;
                IJwtDecoder decoder = Decoder();
                var resultModel = decoder.DecodeToObject<T>(token, secret, verify: true);
                return resultModel;
            }
            catch
            {
                return default(T);
            }

        }
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值