Asp.net WebAPI 使用JWT

本文主要介绍在Asp.net API采用JWT对接口进行Token校验的教程

准备工作:
  • 1 需要提前了解JWT生成Token的逻辑
  • 2服务端需要安装JWT客户端与Redis缓存服务器,Token保存在Redis中
  • 3 客户端采用的layui自定义封装的Ajax 模块请求接口
接口请求流程图

请求流程

  • 步骤1:客户端向服务端请求数据之前,先向服务端请求token

客户端代码请求Token代码:

layui.use(['jquery', 'layer', 'axioshelper'], function () { 
        var $ = layui.$;
        var axioshelper = layui.axioshelper;
        $("#btn").click(function () {
            var pre = {};           
            pre.Uaccount = "admin";
            pre.Upwd="123456";
            pre.Sub = "123456";
            var request = {};
            request.type = 'POST';
            request.url = 'http://localhost:7192/api/SystemToken?expiresAbsoulute=1';
            request.data = pre;
            request.datatype = "json";
            //request.token = $("#Token").val();           
            request.success = function (result) {
                console.log(result);              
            }
            axioshelper.ajax(request);
        });
  • 步骤2:服务端验证通过登陆名和密码后,生成JWT Token 返回给客户端

客户端把用户名和密码传递到服务端,如果用户名和密码正确,则返回一个Token ,此Token保存在Redis中,并带有过期时间
在此当用户名和密码为 "admin" && "123456"时,登录成功,通过 JwtHelper.GetToken生成 JWT Token

服务端生成Token接口:

 /// <summary>
        /// 生成Token
        /// </summary>
        /// <param name="model">s实体类</param>       
        /// <param name="expiresAbsoulute">绝对过期时间(单位小时)</param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult GetToken([FromBody] TokenModel model, int expiresAbsoulute=24)
        {
            if (model.Uaccount == "admin" && model.Upwd == "123456")
            {
                //string jwtStr = TokenHelper.IssueJWT(model);
                 bool result = JwtHelper.GetToken(model,out string jwtStr);
                if (result)
                {                    
                    return Ok(jwtStr);
                }                
            }
            return BadRequest();
        }
        #endregion
 public static bool GetToken(TokenModel tokenModel , out string result,int expiresSliding = 5, int expiresAbsoulute = 24)
        {
            result = "";
            try
            {
                DateTime UTC = DateTime.Now;
                var payload = new Dictionary<string, object>
            {
                {"sub",tokenModel.Sub},
                //{"jti",Guid.NewGuid().ToString() },//JWT ID,JWT的唯一标识
                {"iat", UTC.ToString() },//JWT颁发的时间
                {"issuer","凌云木"},//签发者
                {"audience", tokenModel.Uaccount},//jwt的接收该方,非必须              
                {"exp",UTC.AddHours(expiresAbsoulute).ToString()},//JWT生命周期                           
            };
                IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
                IJsonSerializer serializer = new JsonNetSerializer();
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
                result = encoder.Encode(payload, secret);
                RedisHelper redis = new RedisHelper();                
                var a=redis.SetStringKey(EncryptionAlgorithm.EncryptString(result), result, TimeSpan.FromMinutes(5));
                return a;
            }
            catch (Exception e)
            {
                LogHelper.WriteErrorLog("DecodeJwtToken", $"{e}");
                return false;

            }
Token
  • 步骤3:客户端用带有Token的请求头向服务端请求数据
        var request = {};
        request.type = 'GET';
        request.url = 'http://localhost:7192/api/Values?id=1';          
        request.datatype = "json";
        request.token = token;           
        request.success = function (result) {
            console.log(result);           
            //alert(result);
        }
        axioshelper.ajax(request);

服务端返回数据之前先要校验Token是否有效,
1 查看Redis是否存有此Token
2

 private bool ValidateToken(string encryptToken)
        {
            var rediskey=  EncryptionAlgorithm.EncryptString(encryptToken);
            var rediskeyvalue= redis.GetStringValue(rediskey);//校验Redis中是否含有此Token
            if (rediskeyvalue != encryptToken)
            {
                return false;
            }
          //解析Token
            if (!JwtHelper.DecodeJwtToken(encryptToken, out string result))
            {
                return false;
            }
            if (!JsonHelper.DeserializeJsonToObject<TokenAnalysis>(result, out TokenAnalysis TokenModel))
            {
                return false;
            }
            //判断Token的绝对过期时间
            if (TokenModel.exp > DateTime.Now)
            {              
                redis.SetStringKey(rediskey, encryptToken, TimeSpan.FromMinutes(5));
                return true;
            }
            return false;
           
        }
  • 步骤4:服务端返回请求数据
image.png

如果不带Token请求服务数据时


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容