WebAPI 安全性 使用TOKEN+签名验证(下)

web教程:WebAPI 安全性 使用TOKEN+签名验证(下)

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

  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 parameters = new Dictionary();

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

  {

  string key = form.Keys[f];

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

  }

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

  IDictionary sortedParams = new SortedDictionary(parameters);

  IEnumerator> 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签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全

时间: 2024-10-10 16:26:39

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

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

首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如: 请求来源(身份)是否合法? 请求参数被篡改? 请求的唯一性(不可复制),防止请求被恶意攻击 为了保证数据在通信时的安全性,我们可以采用TOKEN+参数签名的方式来进行相关验证. 比如说我们客户端需要查询产品信息这个操作来进行分析,客户端点击查询按钮==>调用服务器端api进行查询==>服务

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

web培训首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如: 请求来源(身份)是否合法? 请求参数被篡改? 请求的唯一性(不可复制),防止请求被恶意攻击 为了保证数据在通信时的安全性,我们可以采用TOKEN+参数签名的方式来进行相关验证. 比如说我们客户端需要查询产品信息这个操作来进行分析,客户端点击查询按钮==>调用服务器端api进行查询=

TOKEN+签名验证

TOKEN+签名验证 首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如: 请求来源(身份)是否合法? 请求参数被篡改? 请求的唯一性(不可复制),防止请求被恶意攻击 为了保证数据在通信时的安全性,我们可以采用TOKEN+参数签名的方式来进行相关验证. 比如说我们客户端需要查询产品信息这个操作来进行分析,客户端点击查询按钮==>调用服务器端ap

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

本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get("api/token?username=cuong&password=1").then(function (res) { // 返回一个token /* token示例如下 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZ

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

前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点传续的其他情况以及利用webclient来实现断点传续,至此关于webapi断点传续下载以及上传内容都已经全部完结,一直嚷嚷着把SQL Server和Oracle数据库再重新过一遍,这篇过完,就要开始新的征程,每一个阶段都应该有自己的小目标,要不然当工作太忙没时间去充电,太闲又变得懒散,想想一切是为了未来买得起孩子高档的奶粉就又有动力了. 话题 关于webapi断点传续下载的情况,之前我们利用webapi内置的api展开了具体

TOKEN+签名验证有办法绕过吗

我发现一款软件就是不知道怎么绕过他的签名校验,大牛帮忙看看指导下  地址:https://pan.baidu.com/s/1o8t1hXo

如何调用基于TOKEN签名验证ASP.NET Web API

1.首先获得Token 2.通过Token调用

asp.net mvc中包含webapi时,token失效产生302的解决方案

public void ConfigureAuth(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuth

WebApi传参总动员(填坑)

本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑. 这个坑就是: (body 只能被读取一次)Only one thing can read the body MVC和WebAPI之间的一个关键不同点在于MVC缓存请求主体(request body).这意味着MVC的参数绑定可以反复从body中查找参数片断.然而,在WebAPI中,请求主体(HttpContent) 只能被读取一次,不被缓存,只能向前读取的流.这意味着parameter binding需要谨慎对待s