c# 使用 jwt

基于 oauth2.0 协议,

具体原理可以参考:https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

    public class JWTHelper
    {
        private const string salt = "123";//盐
        //获得jwt令牌
        public static string Create(string info)
        {
            Dictionary<string, string> header = new Dictionary<string, string>();
            header.Add("alg", "MD5");
            header.Add("typ", "JWT");

            Dictionary<string, object> payload = new Dictionary<string, object>();
            //JWT 官方字段
            DateTime now = System.DateTime.Now;
            payload.Add("exp", now.AddHours(24));//过期时间
            payload.Add("nbf", now);//生效时间
            payload.Add("iat", now);//签发时间

            //jwt 特有字段
            payload.Add("info", info);

            string base64Header = Base64Url(Newtonsoft.Json.JsonConvert.SerializeObject(header));
            string base64Payload = Base64Url(Newtonsoft.Json.JsonConvert.SerializeObject(payload));
            string tmp = base64Header + "." + base64Payload;
            string sign = Md5(tmp + salt);//加盐
            return base64Header + "." + base64Payload + "." + sign;
        }

        //校验是否合法,是否过期
        public static bool Check(string token, out string info)
        {
            info= "";
            try
            {
                string[] arr = token.Split('.');
                string base64Header = arr[0];
                string base64Payload = arr[1];
                string sign = arr[2];
                var signCheck = Md5(base64Header + "." + base64Payload + salt);
                if (signCheck != sign)
                {
                    return false;
                }
                var dic = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(Base64UrlDecode(base64Payload));
                if (Convert.ToDateTime(dic["exp"]) < System.DateTime.Now)
                {
                    //过期了
                    return false;
                }
                info = dic["info"].ToString();
                return true;
            }
            catch (Exception err)
            {
                return false;
            }
        }

        //获得base64编码
        private static string Base64Url(string input)
        {
            //Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。
            string output = "";
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input);
            try
            {
                output = Convert.ToBase64String(bytes).Replace('+', '-').Replace('/', '_').TrimEnd('=');
            }
            catch (Exception e)
            {
                throw e;
            }
            return output;
        }
        //获得base64解码
        private static string Base64UrlDecode(string input)
        {
            string output = "";

            input = input.Replace('-', '+').Replace('_', '/');
            switch (input.Length % 4)
            {
                case 2:
                    input += "==";
                    break;
                case 3:
                    input += "=";
                    break;
            }
            byte[] bytes = Convert.FromBase64String(input);
            try
            {
                output = System.Text.Encoding.UTF8.GetString(bytes);
            }
            catch
            {
                output = input;
            }
            return output;
        }
        //获得md5校验码
        private static string Md5(string input, int bit = 16)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider md5Hasher = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] hashedDataBytes;
            hashedDataBytes = md5Hasher.ComputeHash(System.Text.Encoding.GetEncoding("gb2312").GetBytes(input));
            System.Text.StringBuilder tmp = new System.Text.StringBuilder();
            foreach (byte i in hashedDataBytes)
            {
                tmp.Append(i.ToString("x2"));
            }
            if (bit == 16)
                return tmp.ToString().Substring(8, 16);
            else
            if (bit == 32) return tmp.ToString();//默认情况
            else return string.Empty;
        }
    }

  

posted @ 2025-10-27 16:37  echo三毛  阅读(4)  评论(0)    收藏  举报