//根据请求类型拼接参数

NameValueCollection form = HttpContext.Current.Request.QueryString;

string data = string.Empty;

switch (method)

{

case "POST":

Stream stream = HttpContext.Current.Request.InputStream;

string responseJson = string.Empty;

StreamReader streamReader = new StreamReader(stream);

data = streamReader.ReadToEnd();

break;

case "GET":

//第一步:取出所有get参数

IDictionary<string, string> parameters = new Dictionary<string, string>();

for (int f = 0; f < form.Count; f++)

{

string key = form.Keys[f];

parameters.Add(key, form[key]);

}

// 第二步:把字典按Key的字母顺序排序

IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);

IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();

// 第三步:把所有参数名和参数值串在一起

StringBuilder query = new StringBuilder();

while (dem.MoveNext())

{

string key = dem.Current.Key;

string value = dem.Current.Value;

if (!string.IsNullOrEmpty(key))

{

query.Append(key).Append(value);

}

}

data = query.ToString();

break;

default:

resultMsg = new ResultMsg();

resultMsg.StatusCode = (int)StatusCodeEnum.HttpMehtodError;

resultMsg.Info = StatusCodeEnum.HttpMehtodError.GetEnumText();

resultMsg.Data = "";

actionContext.Response = HttpResponseExtension.toJson(JsonConvert.SerializeObject(resultMsg));

base.OnActionExecuting(actionContext);

return;

}

bool result = SignExtension.Validate(timestamp, nonce, id, signtoken,data, signature);

if (!result)

{

resultMsg = new ResultMsg();

resultMsg.StatusCode = (int)StatusCodeEnum.HttpRequestError;

resultMsg.Info = StatusCodeEnum.HttpRequestError.GetEnumText();

resultMsg.Data = "";

actionContext.Response = HttpResponseExtension.toJson(JsonConvert.SerializeObject(resultMsg));

base.OnActionExecuting(actionContext);

return;

}

else

{

base.OnActionExecuting(actionContext);

}

}

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)

{

base.OnActionExecuted(actionExecutedContext);

}

}

然后我们进行测试,检验api请求的合法性

Get请求:

1.获取产品数据,传递参数id=1,name="wahaha"  ,完整请求为http://localhost:14826/api/product/getproduct?id=1&name=wahaha

2.请求头添加timespan,staffid,nonce,signature字段

3.如图当data里面的值为id1namewahaha的时候请求头中的signature和服务器端计算出来的result的值是完全一样的,当我将data修改为id1namewahaha1之后,服务器端计算出来的签名result和请求头中提交的signature就不相同了,就表示为不合法的请求了

4.不合法的请求就会被识别为请求参数已被修改

合法的请求则会返回对应的商品信息

post请求:

1.post对象序列化为json字符串后提交到后台,后台返回相应产品信息

2.后台获取请求的参数信息

3.判断签名是否成功,第一次请求签名参数signature和服务器端计算result完全相同, 然后当把请求参数中count的数量从10改成100之后服务器端计算的result和请求签名参数signature不同,所以请求不合法,是非法请求,同理如果其他任何参数被修改最后计算的结果都会和签名参数不同,请求同样识别为不合法请求

总结:

通过上面的案例,我们可以看出,安全的关键在于参与签名的TOKEN,整个过程中TOKEN是不参与通信的,所以只要保证TOKEN不泄露,请求就不会被伪造。

然后我们通过timestamp时间戳用来验证请求是否过期,这样就算被人拿走完整的请求链接也是无效的。

Sign签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全

源码地址:https://github.com/13138899620/TokenSign

WebAPI 安全性 使用TOKEN+签名验证(下)的更多相关文章

  1. WebApi安全性 使用TOKEN+签名验证 (秘钥是GUID的,私有的,不是雙方的,并不在网络连接上传输)

    转http://www.cnblogs.com/MR-YY/archive/2016/10/18/5972380.html WebApi安全性 使用TOKEN+签名验证   首先问大家一个问题,你在写 ...

  2. WebApi安全性 使用TOKEN+签名验证

    首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题, ...

  3. WebAPI 安全性 使用TOKEN+签名验证(上)

    首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题, ...

  4. WebApi安全性 参数签名校验(结合Axios使用)

    接口参数签名校验,是WebApi接口服务最重要的安全防护手段之一. 结合项目中实际使用情况,介绍下前后端参数签名校验实现方案. 签名校验规则 http请求,有两种传参形式: 1.通过url传参,最常见 ...

  5. TOKEN+签名验证

    TOKEN+签名验证 首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面 ...

  6. NET WebAPi之断点续传下载(下)

    NET WebAPi之断点续传下载(下) 前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载 ...

  7. webapi中使用token验证(JWT验证)

    本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...

  8. ASP.NET WebAPi之断点续传下载(下)

    前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把S ...

  9. App开放接口API安全性之Token签名Sign的设计与实现

    前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...

随机推荐

  1. sgu551 Preparing Problem

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=551 呵呵,题目读的没错,可惜理解错了..== #include <cstdi ...

  2. HDU 4497 数论+组合数学

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 解题思路:将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y' ...

  3. Introduction to Monte Carlo Tree Search (蒙特卡罗搜索树简介)

    Introduction to Monte Carlo Tree Search (蒙特卡罗搜索树简介)  部分翻译自“Monte Carlo Tree Search and Its Applicati ...

  4. 出现Fatal IO error 11 (资源暂时不可用) on X server :0.0.的可能原因及解决方案

    我在使用python的过程当中发现了这个有这样的错误,后来看了下面这篇文档才知道原因所在. 最近在编写一个局域网的聊天工具,在编写客户端时,我把界面部分和事件处理函数写好后,准备再开一个线程用于接收服 ...

  5. Firefox-常用扩展

    抓包: HttpFox,相比 Firebug 在页面跳转或刷新时依旧保持原有数据 常用User-Agent模拟: User Agent Switcher 更改请求头: ModifyHeaders 更改 ...

  6. SQL_TRACE与tkprof分析

    一. SQL_TRACE 当SQL语句出现性能问题时,我们可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪,我们可以了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL ...

  7. C++ map详解

    1.什么是mapmap是一个键值对容器.在处理一对一数据是,很有用. 2.map数据结构的特点map内部自建一颗红黑树,这棵树具有对数据自动排序的功能,因此,map内的数据都是按key的值排好序的. ...

  8. awk笔记

    http://www.cnblogs.com/zhuyp1015/archive/2012/07/14/2591842.html awk实例练习 http://www.cnblogs.com/repo ...

  9. noip2011普及组——数字反转

    数字反转 时间限制:1s 内存限制:128MB[问题描述]给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零 ...

  10. FASTDFS .net 客户端

    FastDFS .net 客户端目前还比较少,而且使用大部分没有原生提供的方便 推荐一个比较方便的 下载地址: https://www.nuget.org/packages/NengLong.CMP. ...