关于解决.net服务端token存入session,取不到的问题

.net服务端获取token存入缓存的接口编写

前言
首先要知道为什么token、openid、sessionKey不能存入session的原因是jQuery的ajax自动会带上cookie,而wx.request不会。wx.request每一次请求相当于一次新的请求导致服务器无法识别单独用户。我这边解决方法是存入缓存。

获取openid和sessionKey的官方接口
参数需要appid,secret,code,

“https://api.weixin.qq.com/sns/jscode2session?appid=null&secret=null” + “&js_code=” + 微信端wx.login获取+ “&grant_type=authorization_code”;

获取token的官方接口,有效期120分钟
参数需要appid,secret

“https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=null&secret=null”;

直接上代码,先是缓存存取的方法,复制即可用

/// <summary>
        /// 创建缓存
        /// </summary>
        /// <param name="key">缓存的Key</param>
        /// <param name="value">缓存的数据</param>
        /// <param name="dateTime">缓存过期时间</param>
        public static bool CreateCache(string key, object value, DateTime expiresAt)
        {
            if (string.IsNullOrEmpty(key) || value == null)
            {
                return false;
            }
            HttpRuntime.Cache.Add(key, value, null, expiresAt, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
            return true;
        }

        /// <summary>
        /// 获取缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public object GetCache(string key)
        {
            return string.IsNullOrEmpty(key) ? null : HttpRuntime.Cache.Get(key);
        }

        /// <summary>
        /// 移除所有缓存
        /// </summary>
        /// <returns></returns>
        public bool RemoveAll()
        {
            IDictionaryEnumerator iDictionaryEnumerator = HttpRuntime.Cache.GetEnumerator();
            while (iDictionaryEnumerator.MoveNext())
            {
                HttpRuntime.Cache.Remove(Convert.ToString(iDictionaryEnumerator.Key));
            }
            return true;
        }

接口的编写
复制即可用,输入appid和secret
简述:调用接口,如果缓存中不存在token就重新获取并存入缓存,应该token的有效期的120分钟后过期,所以这边是存入缓存110分钟过期,如果存在token就直接返回。

    [WebMethod(EnableSession = true)]
            public void GetToken()
            {
                if (GetCache("access_token") == null)
                {
                    string stoken = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=“你的”&secret=“你的”";
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(stoken);
                    request.Method = "GET";
                    request.ContentType = "text/html;charset=utf-8";
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream myResponseStream = response.GetResponseStream();
                    StreamReader myStreamReader = new StreamReader(myResponseStream, System.Text.Encoding.UTF8);
                    string retStringtoken = myStreamReader.ReadToEnd();
                    myResponseStream.Close();
                    myStreamReader.Close();
                    JObject retStringtokenJob = JObject.Parse(retStringtoken);
                    var obj = new
                    {
                        access_token = retStringtokenJob["access_token"].ToString(),
                    };
                    //获取当前时间
                    DateTime dt = DateTime.Now.AddMinutes(110);
    
                    Formatting microsoftDataFormatSetting = default(Formatting);
                    string result = JsonConvert.SerializeObject(obj, microsoftDataFormatSetting);
                    bool bl = CreateCache("access_token", result, dt);
                    HttpContext.Current.Response.Write(result);
                }
                else HttpContext.Current.Response.Write(GetCache("access_token"));
            }

微信端通过接口获取token存入全局变量

    getToken: function() {
        var that = this;
        wx.login({
          success: res => {
            // ------ 获取凭证 ------
            var code = res.code;
            if (code) {
              console.log('获取用户登录凭证:' + code);
              // ------ 发送凭证 ------
              wx.request({
                url: '你的接口地址',
                data: {
                  'json_code': res.code
                },
                method: 'GET',
                header: {
                  'content-type': 'appication/x-www-form-urlencoded'
                },
                success: function(res) {
                  that.globalData.access_token = res.data.access_token;
                  console.log(res.data.access_token);
                }
              })
            } else {
              console.log('获取用户登录失败:' + res.errMsg);
            }
          }
        })
      },
       globalData: {
           access_token: "",
  }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 .NET 中的 JWT token,确保过期时间正确设置需要注意以下几点: 1. 确保使用的 JWT 库是最新版本。在 .NET 中,常用的 JWT 库包括 System.IdentityModel.Tokens.Jwt 和 Microsoft.IdentityModel.Tokens。确保你使用的是最新版本的库,以获得最佳的功能和修复了可能存在的问题。 2. 仔细检查过期时间的设置。在生成 JWT token 时,确保过期时间(expiration time)是正确设置的,并且与你的需求相符。一般来说,过期时间应该是一个未来的时间点,例如 `DateTime.UtcNow.AddMinutes(1)` 表示过期时间为当前时间加上 1 分钟。 3. 验证过期时间。在验证 JWT token 时,确保你正确地获到了 token 中的过期时间,并与当前时间进行比较。使用 `DateTime.UtcNow` 获当前时间,并与 token 的过期时间进行比较,判断是否已经过期。 ```csharp var tokenHandler = new JwtSecurityTokenHandler(); var jwtToken = tokenHandler.ReadJwtToken(jwtTokenString); var expirationTime = jwtToken.ValidTo; // 获过期时间 if (expirationTime < DateTime.UtcNow) { // token 已过期,处理相关逻辑 } ``` 4. 检查时区设置。在处理过期时间时,确保你使用的是正确的时区设置。在 .NET 中,默认使用的是 UTC 时间,因此在比较过期时间时,也要使用 UTC 时间。 如果你仍然遇到过期时间不正确的问题,请提供更多相关的代码和上下文信息,以便我们能够更好地帮助你解决问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值