ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JWT认证

2022-06-01 06:00:36  阅读:188  来源: 互联网

标签:加密 string JWT QYVXHttpHelper 认证 token ex HttpContext


前言:

         早期时有涉及过单点登录,一直未有比较清晰直观的理解权限认证这块的东西,本文将从概念到项目中的运用详细讲解(含项目中部分代码)PS:ASE加密解密方法未贴出

 

正文:

          JWT 是什么?

JWT的全称是:Json-web-Token,从字面是上我们不难理解,即web端的一个json类型的token,各方之间的安全json访问对象

JWT分为三部分

     1.head

         head里面的内容是json串,有两个参数,type:jwt  alg:RSA或者ASE等,这里是代表需要用什么算法进行加密解密

     2Payload 

        payload也是json串,这里用来写一些注册信息,公开以及私有的一些方法

    3Signature 

      Signature 签名,这一步部分是head+payload里的信息整合进行签名,具体是将head的json进行加密、将payload的json进行加密,这两部信息中间用点(.)进行分割,然后再同一将整合的内容进行再次加密,得到的就是最终的token

JWT使用过程

client端向认证服务器发起认证授权请求,认证通过后,会向client客户端发送一个token串,客户端拿到token串后再去访问服务器即可

JWT认证优缺点

优点:

认证通过的情况下,资源服务器不必再次做校检token正确与否,只要资源服务器能将token串解密开就可以了,可以减轻认证授权中心的压力

缺点:

JWT的token串里的内容多,会很影响性能,安全性能比较弱,一般设置过期的时间不宜太长,而且这个token串在client端是需要存储的

 

项目使用案例:

之前在项目中有开始接触企业微信,需要使用到token做权限验证,即企业微信平台提供一个json串的token,进行加密以及解密操作

这里企业微信会有两个操作,第一次做一个验证URL的操作,发起一个Get请求,在请求中带入特定的参数,然后使用ASE加密解密算法对参数进行处理,验证通过后,用户发送信息,服务端发起一个Post的请求

操作与第一步类似,只是在这里会把发送的信息以xml的格式包含在请求head里,此时需要取出然后进行解密再进行拆分,即可获取发送信息,然后再将信息加密后推送至另一端。

第一次验证操作

             //Controllers里的方法
CallBackService callBack = new CallBackService(); msg_signature = HttpContext.Current.Request.QueryString["msg_signature"]; timestamp = HttpContext.Current.Request.QueryString["timestamp"]; nonce = HttpContext.Current.Request.QueryString["nonce"]; echostr = HttpContext.Current.Request.QueryString["echostr"]; return callBack.CallBackCheck(msg_signature, timestamp, nonce, echostr);
//Service里的方法
string sVerifyMsgSig = QYVXHttpHelper.ParseUrl("msg_signature"); string sVerifyTimeStamp = QYVXHttpHelper.ParseUrl("timestamp"); string sVerifyNonce = QYVXHttpHelper.ParseUrl("nonce"); QYWeixinHelper.CreateLog("sVerifyMsgSig" + sVerifyMsgSig + "</br>" + "sVerifyTimeStamp:" + sVerifyTimeStamp + "</br>" + "sVerifyNonce:" + sVerifyNonce); //这里注意解码 由于很多验证需要用到密文,解析的时候一定要注意 //直接使用UrlDecode会导致+号丢失 string sVerifyEchoStrtemp = QYVXHttpHelper.ParseUrl("echostr"); string sVerifyEchoStrtemp22 = System.Web.HttpUtility.UrlEncode(sVerifyEchoStrtemp); string sVerifyEchoStr = System.Web.HttpUtility.UrlDecode(sVerifyEchoStrtemp22); QYWeixinHelper.CreateLog("sVerifyEchoStr" + sVerifyEchoStr); string sEchoStr = ""; try { //如果验证通过,把明文作为Get请求的返回值, if (CheckSignature(sToken, sCorpID, sEncodingAESKey, sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr)) { QYWeixinHelper.CreateLog("权限验证通过了"); HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; HttpContext.Current.Response.Write(sEchoStr); return QYVXHttpHelper.ToHttpMsgForWeChat(sEchoStr); } else { return QYVXHttpHelper.ToHttpMsgForWeChat("验证失败,检查CallBackCheck方法"); } } catch (Exception ex) { return QYVXHttpHelper.ToHttpMsgForWeChat(ex.ToString()); }

第二次发送信息(Post 请求)        //1.验证消息的真实性,并进行解密        //2 根据发送内容不同,指定不同的回复格式 

//3把回复的数据再次加密,返回
        public static HttpResponseMessage CallBackSend(string sReqMsgSig, string sReqTimeStamp, string sReqNonce, string sReqData)
        {
string sToken = ReadConfigHelper.ReadBackConfig("Token"); //"swygRd6";
            string sCorpID = ReadConfigHelper.ReadBackConfig("corpid");  // "wx5823bf96d3bd56c7";
            string sEncodingAESKey = ReadConfigHelper.ReadBackConfig("EncodingAESKey"); //"QReQh5qrKlyxNg2NPdH1S6MJSVF8f2LMWI6vrlOV7X6";


            // Post请求的密文数据
           
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);


            string sMsg = "";  // 解析之后的明文
            int ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData, ref sMsg);
            //ret==0表示解密验证成功
            if (ret != 0)
            {
            return QYVXHttpHelper.ToHttpMsgForWeChat("CallBackSend验证失败");
            }

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(sMsg);
            XmlNode root = doc.FirstChild;


            #region 回复消息格式 
         
            string MsgType = root["MsgType"].InnerText;

            #endregion

            string Content = string.Empty;
            string PicUrl = string.Empty;
            string MediaId = string.Empty;

            string ResponseResult = string.Empty;
            if (MsgType == "text")
            {
                QYWeixinHelper.CreateLog("进入文本判断");

                ResponseResult = BackTextXml.ReadTextXml(sMsg);
            }
          //企业需要将发送的信息返回
            // 加密成功,企业需要将加密之后的sEncryptMsg返回

            string sEncryptMsg = ""; //xml格式的密文


            ret = wxcpt.EncryptMsg(ResponseResult, sReqTimeStamp, sReqNonce, ref sEncryptMsg);
            if (ret != 0)
            {
                return QYVXHttpHelper.ToHttpMsgForWeChat("发送的信息加密失败");

            }

            //验证成功,再次解密当前的数据,然后发送

            QYWeixinHelper.CreateLog("ret=0成功,否则失败" + ret);


            
            DmUserExEntity ex = new DmUserExEntity();

            foreach (var item in root)
            {
                ex.Reqid = 580005;
                ex.FromSource = 6;
                ex.AgentName = root["FromUserName"].InnerText;//消息回复方
                ex.AgentId = root["AgentID"].InnerText;
      
                ex.Content = root["Content"].InnerText;
                
            }

 

            HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
            HttpContext.Current.Response.Write(sEncryptMsg);

            return QYVXHttpHelper.ToHttpMsgForWeChat("OK");
        }

 

标签:加密,string,JWT,QYVXHttpHelper,认证,token,ex,HttpContext
来源: https://www.cnblogs.com/JohnTang/p/16333007.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有