Ionic Token 验证


1.需要在app.js 中注册了

   在config 处理如下:

   $httpProvider.interceptors.push('tokenInterceptor')

   tokenInterceptor:定义

 

.factory('tokenInterceptor', function ($rootScope,ENV) {
    return {
      request: function(config){
        config.headers = config.headers || {};
        var usermodel=window.JSON.parse(window.localStorage.getItem(ENV.UserKey));
        if(usermodel!=null){
          // console.log(usermodel);
          config.headers["token"] = usermodel.token;
        }
        return config;
      },
      responseError: function(response){
      }
    };
  })

一般登录成功获取token 保存在 Storage.set(ENV.UserKey, json.userInfo);

.factory('Storage', function ($state, ENV, $http, $rootScope) {
var version = "";
return {
set: function (key, data) {
return window.localStorage.setItem(key, window.JSON.stringify(data));
},
get: function (key) {

return window.JSON.parse(window.localStorage.getItem(key));
},
remove: function (key) {
return window.localStorage.removeItem(key);
}
}
})

 

2.服务的端代码

  token manger 需要根据自己需求修改

 

 public  class TokenManger
    {
        private static TokenManger _instance = null;
        private static readonly object SynObject = new object();
        private const string TOKENNAME = "PASSPORT.TOKEN";
        private static readonly List<UserToken> listtoken = new List<UserToken>();
        private  TokenManger(){}


        public static TokenManger Instance
        {
            get
            {
                if (null == _instance)
                {
                    lock (SynObject)
                    {
                        _instance = new TokenManger();
                    }
                }
                return _instance;
            }
        }
        /// <summary>
        /// 获取用户UUID标识
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public  string  GetUID(string token)
        {
            List<UserToken> utlist = (List<UserToken>)HttpRuntime.Cache[TOKENNAME];
            if (utlist != null && utlist.Count>0)
            {
              var  utmodel=  utlist.Where(w => w.Token == token).FirstOrDefault();
                if (utmodel!=null)
                {
                    return utmodel.Uid.ToString();
                }
            }
            return "";
        }

        /// <summary>
        /// 此方法只用为测试
        /// </summary>
        /// <param name="uid"></param>
        /// <returns></returns>
        public  string GetToken(string uid)
        {
            List<UserToken> utlist = (List<UserToken>)HttpRuntime.Cache[TOKENNAME];
            if (utlist != null && utlist.Count > 0)
            {
                var utmodel = utlist.Where(w => w.Uid == uid).FirstOrDefault();
                if (utmodel != null)
                {
                    return utmodel.Token;
                }
            }
            return "";
        }

        /// <summary>
        /// 判断令牌是否存在
        /// </summary>
        /// <param name="token">令牌</param>
        /// <returns></returns>
        public  bool TokenIsExist(string token)
        {
            List<UserToken> utlist = (List<UserToken>)HttpRuntime.Cache[TOKENNAME];
            if (utlist != null && utlist.Count > 0)
            {
                var utmodel = utlist.Where(w => w.Token == token).FirstOrDefault();
                if (utmodel != null)
                {
                    var timeout = utmodel.Timeout;
                    if (timeout > DateTime.Now)
                    {
                        return true;
                    }
                    else
                    {
                        RemoveToken(token);
                        return false;
                    }
                }
            }
            return false;
        }

        /// <summary>
        /// 移除某令牌
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public  bool RemoveToken(string token)
        {
            List<UserToken> utlist = (List<UserToken>)HttpRuntime.Cache[TOKENNAME];
            if (utlist != null && utlist.Count > 0)
            {
                var utmodel = utlist.Where(w => w.Token == token).FirstOrDefault();
                if (utmodel != null)
                {
                    listtoken.Remove(utmodel);
                }
            }
            return true;
        }

        /// <summary>
        /// 更新令牌过期时间
        /// </summary>
        /// <param name="token">令牌</param>
        /// <param name="time">过期时间</param>
        public  void TokenTimeUpdate(string token, DateTime time)
        {
            List<UserToken> utlist = (List<UserToken>)HttpRuntime.Cache[TOKENNAME];
            if (utlist != null && utlist.Count > 0)
            {
                var utmodel = utlist.Where(w => w.Token == token).FirstOrDefault();
                if (utmodel!=null)
                {
                    utmodel.Timeout = time;
                }
            }
        }

        /// <summary>
        /// 添加令牌
        /// </summary>
        public  void TokenInsert(UserToken ut)
        {
            // token不存在则添加
            if (!TokenIsExist(ut.Token))
            {
                //List<UserToken> utlist = (List<UserToken>)HttpRuntime.Cache[TOKENNAME];
                listtoken.Add(ut);
                //HttpRuntime.Cache.Insert(TOKENNAME, listtoken, null, DateTime.MaxValue, TimeSpan.FromDays(30));
                HttpRuntime.Cache.Insert(TOKENNAME, listtoken, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(15));

            }
            // token存在则更新过期时间
            else
            {
                TokenTimeUpdate(ut.Token, ut.Timeout);
            }
        }
    }

    public class  UserToken{

        /// <summary>
        /// 令牌
        /// </summary>
        public string Token { get; set; }

        /// <summary>
        /// 用户ID凭证
        /// </summary>
        public string Uid { get; set; }

        /// <summary>
        /// 用户类别
        /// </summary>
        public string UserType { get; set; }

        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime Timeout { get; set; }

    }

3.实现Attribute 用于无验证(AnonymousAttribute)和有验证(TokenVerificationAttribute)

 /// <summary>
    /// 匿名访问标记
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class AnonymousAttribute:Attribute
    {
    }
public class TokenVerificationAttribute: ActionFilterAttribute
    {
        private const string UserToken = "token";
        DTcms.BLL.users userball = new DTcms.BLL.users();
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var anonymousAction = actionContext.ActionDescriptor.GetCustomAttributes<AnonymousAttribute>();
            if (!anonymousAction.Any())
            {
                var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase;
                string token = "";
                if (content.Request.Headers[UserToken] != null)
                {
                    token = content.Request.Headers[UserToken].ToString();
                }
                else
                {
                    if (content.Request.QueryString[UserToken] != null)
                    {
                        token= content.Request.QueryString[UserToken].ToString();
                    }
                }
                // 验证token
                var msg = TokenVerification(token);
                if (msg == "")
                {
                    base.OnActionExecuting(actionContext);
                }
                else
                {
                     //throw new Exception(msg);
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, msg);
                }
            }
            else
            {
                // throw new Exception("Token已失效,请重新登陆!");
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, CommonMenthod.GetResultStr("2", 

"Token已失效,请重新登陆")); } } /// <summary> /// 身份令牌验证 /// </summary> /// <param name="actionContext"></param> protected virtual string TokenVerification(string token) { string msg = ""; if (!string.IsNullOrEmpty(token)) { // 判断token是否有效 if (!TokenManger.Instance.TokenIsExist(token)) { msg = CommonMenthod.GetResultStr("2", "Token已失效,请重新登陆!") ; } else { // 判断用户是否被冻结 var usemodel = userball.GetModel(int.Parse(TokenManger.Instance.GetUID(token))); if (usemodel != null ) { if( usemodel.status == 3) { TokenManger.Instance.RemoveToken(token); // msg = "此用户已被冻结,请联系客服!"; msg = CommonMenthod.GetResultStr("0", "此用户已被冻结,请联系客服!"); } } } } else { msg = CommonMenthod.GetResultStr("0", "当前用户帐户异常,请重新登陆!"); // msg = "当前用户帐户异常,请重新登陆"; } return msg; } }

4.应用实例

        [HttpGet]
        [TokenVerification]
        public string GetShopOrderList(string uid, string pageIndex, string otype, string usertype)
        {}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM