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