ASP.NET Web APIs 基于令牌TOKEN验证的实现(保存到DB的Token)
2017-06-02 14:34
941 查看
http://www.cnblogs.com/niuww/p/5639637.html
保存到DB的Token
1. 实现对缓存TOKEN的管理,以防IIS服务器的宕机,可以对TOKEN进行持久化存储处理,每次IIS重启重新初始化已经登录成功TOKEN缓存。实现如下:
此篇到此结束,欢迎大家讨论!
那些曾以为念念不忘的事情就在我们念念不忘的过程中,被我们遗忘了。
分类: Web API开发系列
标签: ASP.NET, Web API, AJAX
好文要顶
关注我
收藏该文
行与止
关注 - 7
粉丝 - 21
+加关注
20
1
« 上一篇:基于.Net Framework 4.0 Web API开发(5):ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)
» 下一篇:js Date 时间格式化的扩展
保存到DB的Token
基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现
概述:
ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作。但是在使用API的时候总会遇到跨域 请求的问题, 特别各种APP万花齐放的今天,对API使用者身份角色验证是不能避免的(完全开发的API不需要对使用者身份角色进行管控,可以绕过),这篇文章就来谈 谈基于令牌TOKEN身份验证的实现。问题:
对于Web API的选择性的开放,使用者无论使用AJAX,还是HttpClient对接,总要对使用者的身份角色进行验证,然而使用API总有跨域使用情况的存在,这样就导致所有基于cookie验证方式都不再适用于API的验证。原因:
比如,基于form表单验证的基础是登录验证成功后,用户的信息存在缓存或数据库或cookie,无论哪种方式存储用户信息,都不能绕过对 cookie的使用,所以form表单验证方法对于禁用cookie的浏览器都不能正常使用,结论就是不能使用cookie 的环境就不能使用基本的form表单验证方式。因此WEB API 由于跨域的使用,导致cookie不能正常工作,所以不能再使用基于表单验证的方式来实现。基于令牌TOKEN验证方法的实现:
方法一:1. 实现对缓存TOKEN的管理,以防IIS服务器的宕机,可以对TOKEN进行持久化存储处理,每次IIS重启重新初始化已经登录成功TOKEN缓存。实现如下:
1 /// <summary> 2 /// 用户令牌验证 3 /// </summary> 4 public class TokenAuthorizeAttribute : ActionFilterAttribute 5 { 6 private const string UserToken = "token"; 7 public override void OnActionExecuting(HttpActionContext actionContext) 8 { 9 // 匿名访问验证 10 var anonymousAction = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(); 11 if (!anonymousAction.Any()) 12 { 13 // 验证token 14 var token = TokenVerification(actionContext); 15 } 16 base.OnActionExecuting(actionContext); 17 } 18 19 /// <summary> 20 /// 身份令牌验证 21 /// </summary> 22 /// <param name="actionContext"></param> 23 protected virtual string TokenVerification(HttpActionContext actionContext) 24 { 25 string msg = ""; 26 // 获取token 27 var token = GetToken(actionContext, out msg); 28 if (!string.IsNullOrEmpty(msg)) 29 actionContext.Response = actionContext.Request.CreateResponse<NoAuthData>(System.Net.HttpStatusCode.OK, new NoAuthData() { code = "401", msg = msg }); 30 // 判断token是否有效 31 if (!UserTokenManager.IsExistToken(token)) 32 { 33 actionContext.Response = actionContext.Request.CreateResponse<NoAuthData>(System.Net.HttpStatusCode.OK, new NoAuthData() { code = "401", msg = "Token已失效,请重新登录!" }); 34 //actionContext.Response = actionContext.Request.CreateResponse<NoAuthData>(System.Net.HttpStatusCode.Unauthorized, new NoAuthData() { code = "401", msg = "Token已失效,请重新登录!" }); 35 // actionContext.Response = actionContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, "Token已失效,请重新登录!"); 36 } 37 38 return token; 39 } 40 41 private string GetToken(HttpActionContext actionContext, out string msg) 42 { 43 Dictionary<string, object> actionArguments = actionContext.ActionArguments; 44 HttpMethod type = actionContext.Request.Method; 45 msg = ""; 46 var token = ""; 47 if (type == HttpMethod.Post) 48 { 49 if (actionArguments.ContainsKey(UserToken)) 50 { 51 if (actionArguments[UserToken] != null) 52 token = actionArguments[UserToken].ToString(); 53 } 54 else 55 { 56 foreach (var value in actionArguments.Values) 57 { 58 if (value != null && value.GetType().GetProperty(UserToken) != null) 59 token = value.GetType().GetProperty(UserToken).GetValue(value, null).ToString(); 60 } 61 } 62 63 if (string.IsNullOrEmpty(token)) 64 msg = "登录超时,请重新登录!"; 65 } 66 else if (type == HttpMethod.Get) 67 { 68 if (!actionArguments.ContainsKey(UserToken)) 69 msg = "还未登录"; 70 // throw new HttpException(401, "还未登录"); 71 72 if (actionArguments[UserToken] != null) 73 token = actionArguments[UserToken].ToString(); 74 else 75 msg = "登录超时,请重新登录!"; 76 } 77 else 78 { 79 throw new HttpException(404, "暂未开放除POST,GET之外的访问方式!"); 80 } 81 return token; 82 } 83 } 84 85 public class NoAuthData 86 { 87 public string code { get; set; } 88 public string msg { get; set; } 89 }
此篇到此结束,欢迎大家讨论!
那些曾以为念念不忘的事情就在我们念念不忘的过程中,被我们遗忘了。
分类: Web API开发系列
标签: ASP.NET, Web API, AJAX
好文要顶
关注我
收藏该文
行与止
关注 - 7
粉丝 - 21
+加关注
20
1
« 上一篇:基于.Net Framework 4.0 Web API开发(5):ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)
» 下一篇:js Date 时间格式化的扩展
相关文章推荐
- 基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现
- 基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现
- Web APIs 基于令牌TOKEN验证的实现
- 基于.Net Framework 4.0 Web API开发(3):ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现
- .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
- asp.net Web API 身份验证 不记名令牌验证 Bearer Token Authentication 简单实现
- 如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- [转]在ASP.NET中如何用C#.NET实现基于表单的验证(二)
- 在ASP.NET中如何用C#.NET实现基于表单的验证
- 在ASP.NET中如何用C#.NET实现基于表单的验证
- 在ASP.NET中如何用C#.NET实现基于表单的验证
- 基于ASP.NET Web Application的插件实现,附DEMO
- 如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- 基于ASP.NET Web Application的插件实现,附DEMO
- 基于ASP.NET AJAX框架实现表单验证编程原理
- 在ASP.NET中如何用C#.NET实现基于表单的验证
- ASP.NET Web下基于Forms的验证
- 使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- 如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- ASP.NET基于表单的验证实现网上安全访问,管理(2)