回到目录

对于一个Http请求如何保证它的安全,这已经不是一个新的话题,对于请求的安全我们通常考虑的无非就是"请求的被篡改性"和"请求的被复制性",第一个问题我们很容易实现,可以通过参数+密钥的方式,而第二个问题就很难实现了,到目前为止也没有一个统一的标准,今天我们要说的安全性,也主要针对的第一种来讲的.

对于一个URL地址来说,可能是这样的格式

http://www.domain.com?vid=1&type=3&main=ok 

对上面地址进行安全防篡改之后,可能地址就变成了这样

http://www.domain.com?vid=1&type=3&main=ok&cipherText=e10adc3949ba59abbe56e057f20f883e

其中cipherText我们叫做密文,它由所有参数名+参数值+钥密再进行md5生成的,其中钥密是不公开的,在数据传递过程中,只要修改任意参数,你生成的cipherText就与我们正确的值不同,这时,你的验证就是不通过的,呵呵.

对此,我把这套逻辑进行了抽象,提取到了特性里(过滤器),如果你的action需要进行这种安全性验证的话,直接在方法上添加这个特性即可

 /// <summary>
/// api数据安全性验证
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class ApiValidateFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var method = request.HttpMethod;
var passKey = "tsingda123";
var paramStr = new StringBuilder(); foreach (string param in request.Form.Keys)
{
if (param != "cipherText")
paramStr.Append(request.Form[param]);
}
paramStr.Append(passKey);
if (VCommons.Encryptor.Utility.EncryptString(paramStr.ToString(), VCommons.Encryptor.Utility.EncryptorType.MD5) != request.Form["cipherText"])
{
//验证失败
filterContext.HttpContext.Response.ContentType = "applicatin/json";
filterContext.HttpContext.Response.Write(VCommons.SerializeMemoryHelper.SerializeToJson(new { Message = "验证失败" }));
filterContext.HttpContext.Response.End();
}
else
{
base.OnActionExecuting(filterContext);
} }
}

使用时非常简单,呵呵

     [ApiValidateFilter]
public JsonResult AddHello(string username, string password, string email)
{
return Json(new { Message = username + password + email }, JsonRequestBehavior.AllowGet);
}

在系统架构的世界里,我们需要的已经对问题的抽象,对代码的重构,这种重构是不断的,反复的,我一直不相信"有一次写好的代码",代码是在不断的重构中完美的!

回到目录

WebApi系列~基于单请求封装多请求的设计~请求的安全性设计与实现的更多相关文章

  1. WebApi系列~基于单请求封装多请求的设计

    回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...

  2. WebApi系列~基于RESTful标准的Web Api

    微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码 ...

  3. WebApi系列~基于RESTful标准的Web Api 转载 https://www.cnblogs.com/lori/p/3555737.html

    微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码 ...

  4. WebApi系列~目录

    回到占占推荐博客索引 写了这个系列的文章不少了,也应该为大家写个目录了,最近很刮了很多SOA的风,很多企业都将自己的系统进行分割,通常是按模块进行拆分,为这个模块提供统一的接口提供业务服务,这不紧可以 ...

  5. flutter dio网络请求封装实现

    flutter dio网络请求封装实现 文章友情链接:   https://juejin.im/post/6844904098643312648 在Flutter项目中使用网络请求的方式大致可分为两种 ...

  6. webapi基于单请求封装多请求的设计【转】

    怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能包含多个子 ...

  7. 简单的基于Vue-axios请求封装

    具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...

  8. uniapp 基于 flyio 的 http 请求封装

    之前写请求都是用别人封装好的,直接 import request 完事,自己第一次写还是一头雾水,学习了一波搞清楚了些,可以写简单的封装了. 首先要搞清楚为什么封装请求,同其他的封装一样,我们把不同请 ...

  9. LXNetwork – 基于AF3.0封装的iOS网络请求库

    本框架实现思路与YTKNetwork和RTNetworking类似,相当于一个简单版,把每一个网络请求封装成对象.使用LXNetwork,你的每一个请求都需要继承LXBaseRequest类,通过覆盖 ...

随机推荐

  1. app.js

    //第一步,引入express模块 var exp = require('express'),     http = require('http'),//引入http模块     path = req ...

  2. Web调试利器OpenWindow

    有些时候调试web页面,在循环里面我们不方便设置断点进行调试,或者调试起来比较麻烦,我们就可以用openWindow的方法打印出想要查看的信息,既方便又省时. 代码如下: OpenWindow = w ...

  3. 如何选择 H5 游戏引擎

    原生手游市场已是红海,腾讯.网易等寡头独霸天下,H5游戏市场或将成为下一个风口.据笔者所知,很多H5游戏开发团队由于选择引擎不慎导致项目甚至团队夭折.如何选择适合团队和项目的引擎,笔者通过学习和项目实 ...

  4. 1260: [CQOI2007]涂色paint

    Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续 ...

  5. JavaScript 三个组成部分

    1.核心(ECMAScript) ECMAScript 仅仅是一个描述,定义了脚本语言的所有属性.方法和对象.其他语言可以实现 ECMAScript 来作为功能的基准,JavaScript 就是这样: ...

  6. project 2016 11 20 树的多项式

    #include <iostream>#include <stack>#include <cmath>#include <sstream> using ...

  7. 【线段树套平衡树】【pb_ds】bzoj3196 Tyvj 1730 二逼平衡树

    线段树套pb_ds里的平衡树,在洛谷OJ上测试,后三个测试点TLE #include<cstdio> #include<algorithm> #include<ext/p ...

  8. ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. FreeRTOS run on eclipse

    所需软件包: FreeRTOS.7.1.0.7zeclipse-cpp-helios-SR2-win32.zipTDM-GCC-32(版本任意吧..但同平台就选择一致的,32位系统就一致32位的软件, ...

  10. uva-10305

      题意:给出n个任务,任务不是完全独立的,有些任务必须依赖另外一些任务才能执行:m个任务关系. 输出:n个任务的可能执行顺序: 我的解决方法:这就是个赤裸裸的拓扑排序,直接dfs拓扑每一个任务点,然 ...