WebApi系列~基於單請求封裝多請求的設計~請求的安全性設計與實現

回到目錄html

對於一個Http請求如何保證它的安全,這已經不是一個新的話題,對於請求的安全咱們一般考慮的無非就是"請求的被篡改性"和"請求的被複制性",第一個問題咱們很容易實現,能夠經過參數+密鑰的方式,而第二個問題就很難實現了,到目前爲止也沒有一個統一的標準,今天咱們要說的安全性,也主要針對的第一種來說的.json

對於一個URL地址來講,多是這樣的格式api

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須要進行這種安全性驗證的話,直接在方法上添加這個特性便可app

 /// <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);
            }

        }
    }

使用時很是簡單,呵呵dom

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

在系統架構的世界裏,咱們須要的已經對問題的抽象,對代碼的重構,這種重構是不斷的,反覆的,我一直不相信"有一次寫好的代碼",代碼是在不斷的重構中完美的!ide

回到目錄ui

相關文章
相關標籤/搜索