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) {}