电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

通用 HTTP 簽名組件的另類實現方式

瀏覽:206日期:2022-06-08 16:47:17
目錄
  • 1、初衷
  • 2、思路
  • 3、直接看效果
  • 4、代碼實現
    • HttpSignItem類
    • HttpSignSetting類
    • HttpSigner類
  • 5、附上倉庫地址

    1、初衷

    開發中經常需要做一些接口的簽名生成和校驗工作,最開始的時候都是每個接口去按照約定單獨實現,久而久之就變的非常難維護,因此就琢磨怎么能夠寫了一個比較通用的簽名生成工具。

    2、思路

    采用鏈式調用的方式,使得簽名的步驟可以動態拼湊組合。

    3、直接看效果

      //設置數據源
        var signSource = new Dictionary<string, string>()
        {
    { "param1", "1" },
    { "param3", "3+" },
    { "param2", "2" }
        };
        var signer = new HttpSigner();
        signer.SetSignData(signSource);
     
        //設置數據源并配置規則
        signer.SetSignData(signSource, setting =>
        {
    //按參數名排序
    //result --> param1 param2 param3
    setting.IsOrderByWithKey = false;
     
    //是否對簽名數據的參數值進行UrlEncode
    setting.IsDoUrlEncodeForSourceValue = false;
     
    //簽名主體是否包含參數名
    setting.IsSignTextContainKey = true;
    //簽名主體中參數和參數值的連接符(需要啟用IsSignTextContainKey)
    setting.SignTextKeyValueSeparator = "=";
    //簽名主體中不同參數項的連接符
    setting.SignTextItemSeparator = "&";
    //以上都開啟后  --> param1=1&param2=2&param3=3
     
    //編碼
    setting.DefaultEncoding = Encoding.UTF8;
        });
     
        //簽名主體設置前綴
        signer.SetSignData(signSource).SetSignTextPrefix("TestPrefix");
     
        //簽名主體設置后綴
        signer.SetSignData(signSource).SetSignTextSuffix("TestSuffix");
     
        //簽名主體進行Base64
        signer.SetSignData(signSource).SetSignTextBase64();
     
        //簽名主體進行MD5,(方法參數為簽名結果是否轉小寫)
        signer.SetSignData(signSource).SetSignTextMD5(bool isToLower = true);
     
        //簽名主體進行SHA1,(方法參數為簽名結果是否轉小寫)
        signer.SetSignData(signSource).SetSignTextSHA1(bool isToLower = true);
     
        //獲取簽名結果
        string signString = signer.SetSignData(signSource).GetSignResult();
     
        //組合調用
        string signString = signer.SetSignData(signSource).SetSignTextBase64().SetSignTextMD5().SetSignTextSHA1();

    4、代碼實現

    HttpSignItem類

    用于保存簽名的參數集合。

    namespace JiuLing.CommonLibs.Security.HttpSign
    {
        internal class HttpSignItem
        {
    public string Key { get; set; }
    public string Value { get; set; }
     
    public HttpSignItem(string key, string value)
    {
        Key = key;
        Value = value;
    }
        }
    }

    HttpSignSetting類

    用于簽名的基本配置。

    using System.Text;
     
    namespace JiuLing.CommonLibs.Security.HttpSign
    {
        /// <summary>
        /// 簽名配置
        /// </summary>
        public class HttpSignSetting
        {
    /// <summary>
    /// 是否按參數名進行排序
    /// </summary>
    public bool IsOrderByWithKey { get; set; } = false;
     
    /// <summary>
    /// 是否對簽名數據的參數值進行UrlEncode
    /// </summary>
    public bool IsDoUrlEncodeForSourceValue { get; set; } = false;
     
    /// <summary>
    /// 簽名主體是否包含參數名
    /// </summary>
    public bool IsSignTextContainKey { get; set; } = true;
     
    /// <summary>
    /// 簽名主體中參數和參數值的連接符(需要啟用IsSignTextContainKey)
    /// </summary>
    public string SignTextKeyValueSeparator { get; set; } = "=";
     
    /// <summary>
    /// 簽名主體中不同參數項的連接符
    /// </summary>
    public string SignTextItemSeparator { get; set; } = "&";
     
    /// <summary>
    /// 編碼
    /// </summary>
    public Encoding DefaultEncoding { get; set; } = Encoding.UTF8;
        }
    }

    HttpSigner類

    簽名組件的具體實現。

    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace JiuLing.CommonLibs.Security.HttpSign
    {
        /// <summary>
        /// 網絡請求簽名工具
        /// </summary>
        public class HttpSigner
        {
    /// <summary>
    /// 簽名配置
    /// </summary>
    private readonly HttpSignSetting _setting = new HttpSignSetting();
    /// <summary>
    /// 最終的簽名串
    /// </summary>
    private string _signString;
     
    /// <summary>
    /// 設置簽名數據
    /// </summary>
    /// <param name="signSource">待簽名的鍵值對</param>
    /// <param name="setting">配置簽名規則</param>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public HttpSigner SetSignData(Dictionary<string, string> signSource, Action<HttpSignSetting> setting = null)
    {
        setting?.Invoke(_setting);
        if (_setting == null)
        {
    throw new ArgumentNullException("無效的簽名配置", "setting");
        }
     
        if (signSource == null || signSource.Count == 0)
        {
    throw new ArgumentException("待簽名數據異常", nameof(signSource));
        }
     
        var signSourceList = new List<HttpSignItem>(signSource.Count);
        foreach (var item in signSource)
        {
    var itemValue = item.Value;
    if (_setting.IsDoUrlEncodeForSourceValue)
    {
        itemValue = System.Web.HttpUtility.UrlEncode(itemValue, _setting.DefaultEncoding);
    }
    signSourceList.Add(new HttpSignItem(item.Key, itemValue));
        }
     
        if (_setting.IsOrderByWithKey)
        {
    signSourceList = signSourceList.OrderBy(x => x.Key).ToList();
        }
     
        if (_setting.IsSignTextContainKey)
        {
    _signString = string.Join(_setting.SignTextItemSeparator, signSourceList.Select(x => $"{x.Key}{_setting.SignTextKeyValueSeparator}{x.Value}"));
        }
        else
        {
    _signString = string.Join(_setting.SignTextItemSeparator, signSourceList.Select(x => x.Value));
        }
     
        return this;
    }
     
    /// <summary>
    /// 簽名主體設置前綴
    /// </summary>
    /// <param name="input">前綴值</param>
    /// <returns></returns>
    public HttpSigner SetSignTextPrefix(string input)
    {
        _signString = $"{input}{_signString}";
        return this;
    }
     
    /// <summary>
    /// 簽名主體設置后綴
    /// </summary>
    /// <param name="input">后綴值</param>
    /// <returns></returns>
    public HttpSigner SetSignTextSuffix(string input)
    {
        _signString = $"{_signString}{input}";
        return this;
    }
     
    /// <summary>
    /// 簽名主體設置后綴
    /// </summary>
    /// <returns></returns>
    public HttpSigner SetUrlEncode()
    {
        _signString = System.Web.HttpUtility.UrlEncode(_signString, _setting.DefaultEncoding);
        return this;
    }
     
    /// <summary>
    /// 簽名主體進行Base64
    /// </summary>
    /// <returns></returns>
    public HttpSigner SetSignTextBase64()
    {
        _signString = Base64Utils.GetStringValue(_signString);
        return this;
    }
     
    /// <summary>
    /// 簽名主體進行MD5
    /// </summary>
    /// <param name="isToLower">簽名結果是否轉小寫</param>
    /// <returns></returns>
    public HttpSigner SetSignTextMD5(bool isToLower = true)
    {
        if (isToLower)
        {
    _signString = MD5Utils.GetStringValueToLower(_signString);
        }
        else
        {
    _signString = MD5Utils.GetStringValueToUpper(_signString);
        }
        return this;
    }
     
    /// <summary>
    /// 簽名主體進行SHA1
    /// </summary>
    /// <param name="isToLower">簽名結果是否轉小寫</param>
    /// <returns></returns>
    public HttpSigner SetSignTextSHA1(bool isToLower = true)
    {
        if (isToLower)
        {
    _signString = SHA1Utils.GetStringValueToLower(_signString);
        }
        else
        {
    _signString = SHA1Utils.GetStringValueToUpper(_signString);
        }
        return this;
    }
     
    /// <summary>
    /// 獲取簽名結果
    /// </summary>
    /// <returns></returns>
    public string GetSignResult()
    {
        return _signString;
    }
        }
    }
    

    5、附上倉庫地址

    以上代碼包含在我的通用類庫中,可以直接Nuget搜索JiuLing.CommonLibs安裝。
    GitHub類庫地址
    文章代碼地址

    到此這篇關于通用 HTTP 簽名組件的另類實現的文章就介紹到這了,更多相關HTTP 簽名組件內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

    標簽: ASP.NET
    主站蜘蛛池模板: 郑州墨香品牌设计公司|品牌全案VI设计公司 | 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 双舌接地线-PC68数字式高阻计-ZC36|苏海百科 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 踏板力计,制动仪,非接触多功能速度仪,逆反射系数测试仪-创宇 | 环比机械| 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | OpenI 启智 新一代人工智能开源开放平台 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | 成都离婚律师|成都结婚律师|成都离婚财产分割律师|成都律师-成都离婚律师网 | 实体店商新零售|微赢|波后|波后合作|微赢集团 | 热处理温控箱,热处理控制箱厂家-吴江市兴达电热设备厂 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 湖南教师资格网-湖南教师资格证考试网 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 |