一个问题
在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也就学了webform的request,response,会提交表单的这种刚接触不久的同学),你怎么去解释标题“webapi token验证”。
简单的来说我的答案是:“要对客户端(浏览器,app)发的请求(提交表单)加限制,这个限制就是不要随随便便就去接收个请求就出查询数据库,最基本的判断要证明此请求是”谁发出的。
API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间
例如这个接口 http://127.0.0.1/api/user/list?type=value 这个获取用户信息的请求总不能在地址栏一输入就直接显示信息(虽然有点夸张,不至于阿猫阿狗的信息这么容易get吧),在写webapi接口原则性的基本要求必须得保证数据的安全性和请求的有效性
在这里我就使用Token+参数签名+时间戳 这三个系统参数来办证请求的有效性(即时100%请求有效,也不能说100%也安全了)。
| 参数名 | 必选 | 类型 | 作用 |
| token | 是 | string | 调用方标识,保障其身份是来自本系统认证过的,有效识别用户身份 |
| sign | 是 | string | 接口参数的key,value的记录,防止参数值被篡改,防止伪装请求 |
| timestamp | 是 | int | 时间戳,防止重放攻击 |
那么问题来
1.token 如何生成?作用是什么?
2.参数签名如何生成?作用是什么?
3.时间戳的作用是什么?
看了这篇文章你就知道了。这三个系统参数是如何保证请求的有效性,一定程度上提高数据的安全性
1.token如何生成的?作用是什么?
[Route("login")] public bool login(string account, string pwd) { var obj = Db.dbUsers.FirstOrDefault(f => f.Account == account && f.Pwd == pwd); if (obj != null) { string token = account.DESEncrypt(desKey);//加密产生token, HttpCookie cookie = new HttpCookie(cookieToken,token); HttpContext.Current.Response.Cookies.Add(cookie);//保存cookie return true; } else { return false; } } [Route("list"), HttpGet] public List<string> List(string type,string token) { var obj = Db.dbUsers.FirstOrDefault(p => p.Account == token.DESDecrypt(desKey)); //验证token if (obj != null) { //返回数据集 } else { //非法请求 } }public class MyFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { var request_param = context.ActionArguments.Values; var queryCollection = context.HttpContext.Request.Query; string account = string.Empty; string password = string.Empty; long timespan = 0; string signature = string.Empty; try { account = queryCollection.Where(p => p.Key == "account").Select(f => f.Value).FirstOrDefault().ToString(); password = queryCollection.Where(p => p.Key == "password").Select(f => f.Value).FirstOrDefault().ToString(); timespan = long.Parse(queryCollection.Where(p => p.Key == "timespan").Select(f => f.Value).FirstOrDefault().ToString()); signature = queryCollection.Where(p => p.Key == "signature").Select(f => f.Value).FirstOrDefault().ToString(); } catch (Exception ex) { var apiresult = ApiResult<bool>.Error("参数异常"+ex.ToString()); context.Result = new JsonResult(apiresult); } //var accountName = context.RouteData.Values["accountName"].ToString() var expires_minute = (timespan - DateTime.Now.Ticks) / 60000000000; if (expires_minute> 10||expires_minute<-10) { var apimodel = ApiResult<bool>.Error("请求超时"+expires_minute); //var json = JsonConvert.SerializeObject(apimodel); JsonResult ret = new JsonResult(apimodel); context.Result =ret; } var ok = ("account" + account + "password" + password).Contains(signature);//ToDO 加密解密 if (ok == false) { var apimodel = ApiResult<bool>.Error("非法请求"); var json = JsonConvert.SerializeObject(apimodel); JsonResult ret = new JsonResult(apimodel); context.Result = ret; } base.OnActionExecuting(context); } }作者:张林
原文标题: webapi token、参数签名是如何生成的
原文链接:http://blog.csdn.net/kebi007/article/details/72861532
转载随意注明出处
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。



