基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现
2016-07-04 11:22
901 查看
概述:
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缓存。实现如下:
/// <summary> /// 用户令牌验证 /// </summary> public class TokenAuthorizeAttribute : ActionFilterAttribute { private const string UserToken = "token"; public override void OnActionExecuting(HttpActionContext actionContext) { // 匿名访问验证 var anonymousAction = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(); if (!anonymousAction.Any()) { // 验证token var token = TokenVerification(actionContext); } base.OnActionExecuting(actionContext); } /// <summary> /// 身份令牌验证 /// </summary> /// <param name="actionContext"></param> protected virtual string TokenVerification(HttpActionContext actionContext) { string msg = ""; // 获取token var token = GetToken(actionContext, out msg); if (!string.IsNullOrEmpty(msg)) actionContext.Response = actionContext.Request.CreateResponse<NoAuthData>(System.Net.HttpStatusCode.OK, new NoAuthData() { code = "401", msg = msg }); // 判断token是否有效 if (!UserTokenManager.IsExistToken(token)) { actionContext.Response = actionContext.Request.CreateResponse<NoAuthData>(System.Net.HttpStatusCode.OK, new NoAuthData() { code = "401", msg = "Token已失效,请重新登录!" }); //actionContext.Response = actionContext.Request.CreateResponse<NoAuthData>(System.Net.HttpStatusCode.Unauthorized, new NoAuthData() { code = "401", msg = "Token已失效,请重新登录!" }); // actionContext.Response = actionContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, "Token已失效,请重新登录!"); } return token; } private string GetToken(HttpActionContext actionContext, out string msg) { Dictionary<string, object> actionArguments = actionContext.ActionArguments; HttpMethod type = actionContext.Request.Method; msg = ""; var token = ""; if (type == HttpMethod.Post) { if (actionArguments.ContainsKey(UserToken)) { if (actionArguments[UserToken] != null) token = actionArguments[UserToken].ToString(); } else { foreach (var value in actionArguments.Values) { if (value != null && value.GetType().GetProperty(UserToken) != null) token = value.GetType().GetProperty(UserToken).GetValue(value, null).ToString(); } } if (string.IsNullOrEmpty(token)) msg = "登录超时,请重新登录!"; } else if (type == HttpMethod.Get) { if (!actionArguments.ContainsKey(UserToken)) msg = "还未登录"; // throw new HttpException(401, "还未登录"); if (actionArguments[UserToken] != null) token = actionArguments[UserToken].ToString(); else msg = "登录超时,请重新登录!"; } else { throw new HttpException(404, "暂未开放除POST,GET之外的访问方式!"); } return token; } } public class NoAuthData { public string code { get; set; } public string msg { get; set; } }
View Code
此篇到此结束,欢迎大家讨论!
相关文章推荐
- ASP.NET-GridView之固定表数据滚动
- 认识与入门 Markdown
- ASP.NET-GridView之表头设计
- Aspose.Cells导入导出
- vs2010 asp.net webForm Html表格数据模板转换pdf文件,web打印Pdf
- ASP.NET网站发布-允许更新此预编译站点 打勾与不打勾的区别
- .net core 1.0 中的asp.net identity 的基本使用 序言
- [ASP.NET]Repeater的使用方法
- ASP.NET总结
- ASP.NET MVC4入门到精通系列目录汇总
- 学习ASP.NET Core,你必须了解无处不在的“依赖注入”
- .NET Core 1.0学习(2)
- Spring 之AOP AspectJ切入点语法详解
- Raspberry Raspbian turning off the UART functioning as a serial console
- 【ASP.NET】——有缘千里来相会
- asp.net mvc5 设置Area下的为启动页
- ASP.NET视频总结
- ASP.NET的缓存机制
- 【iReport+JasperReport】2.在Java工程中利用jasper导出PDF报表
- 【iReport+JasperReport】1.iReport与JasperReport基础