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

简介:

对于一个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系列~基于单请求封装多请求的设计~请求的安全性设计与实现,如需转载请自行联系原博主。

目录
相关文章
|
3月前
|
负载均衡 前端开发 Java
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
124 0
|
3月前
|
JSON 前端开发 JavaScript
关于我认识的请求方式
关于我认识的请求方式有三个
42 0
|
前端开发
前端学习案例2-web服务中的请求和响应之2
前端学习案例2-web服务中的请求和响应之2
39 0
前端学习案例2-web服务中的请求和响应之2
|
前端开发
前端学习案例1-web服务中的请求和响应之1
前端学习案例1-web服务中的请求和响应之1
59 0
前端学习案例1-web服务中的请求和响应之1
|
前端开发
前端学习案例3-web服务中的请求和响应之3
前端学习案例3-web服务中的请求和响应之3
63 0
前端学习案例3-web服务中的请求和响应之3
|
前端开发 API
axios定制化设置请求响应拦截器,统一处理请求响应
设置拦截器的目的在于:可以定制化,设置请求头,公共api,超时时间。统一处理响应,对于前端获取的数据更加清晰。
368 0
|
数据挖掘 Java
封装,分用、客户端服务器以及请求响应
封装,分用、客户端服务器以及请求响应
94 0
封装,分用、客户端服务器以及请求响应
|
前端开发
前端工作小结11-封装请求
前端工作小结11-封装请求
80 0
|
域名解析 网络协议 网络安全
WEB服务请求流程
Http请求解释
105 0
WEB服务请求流程
|
JSON 数据格式
HttpwebClient的四种请求方式
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。    十年河东十年河西,莫欺少年穷。      本文旨在发布代码,供自己参考,也供大家参考,谢谢。     正题:     HttpWebClient的四种请求方式:Get、Post、Put、Delete     系列代码如下: using System; using System.
1198 0