国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

通用 HTTP 簽名組件的另類實現(xiàn)方式

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

    1、初衷

    開發(fā)中經(jīng)常需要做一些接口的簽名生成和校驗工作,最開始的時候都是每個接口去按照約定單獨實現(xiàn),久而久之就變的非常難維護,因此就琢磨怎么能夠?qū)懥艘粋€比較通用的簽名生成工具。

    2、思路

    采用鏈式調(diào)用的方式,使得簽名的步驟可以動態(tài)拼湊組合。

    3、直接看效果

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

    4、代碼實現(xiàn)

    HttpSignItem類

    用于保存簽名的參數(shù)集合。

    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>
    /// 是否按參數(shù)名進行排序
    /// </summary>
    public bool IsOrderByWithKey { get; set; } = false;
     
    /// <summary>
    /// 是否對簽名數(shù)據(jù)的參數(shù)值進行UrlEncode
    /// </summary>
    public bool IsDoUrlEncodeForSourceValue { get; set; } = false;
     
    /// <summary>
    /// 簽名主體是否包含參數(shù)名
    /// </summary>
    public bool IsSignTextContainKey { get; set; } = true;
     
    /// <summary>
    /// 簽名主體中參數(shù)和參數(shù)值的連接符(需要啟用IsSignTextContainKey)
    /// </summary>
    public string SignTextKeyValueSeparator { get; set; } = "=";
     
    /// <summary>
    /// 簽名主體中不同參數(shù)項的連接符
    /// </summary>
    public string SignTextItemSeparator { get; set; } = "&";
     
    /// <summary>
    /// 編碼
    /// </summary>
    public Encoding DefaultEncoding { get; set; } = Encoding.UTF8;
        }
    }

    HttpSigner類

    簽名組件的具體實現(xiàn)。

    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace JiuLing.CommonLibs.Security.HttpSign
    {
        /// <summary>
        /// 網(wǎng)絡(luò)請求簽名工具
        /// </summary>
        public class HttpSigner
        {
    /// <summary>
    /// 簽名配置
    /// </summary>
    private readonly HttpSignSetting _setting = new HttpSignSetting();
    /// <summary>
    /// 最終的簽名串
    /// </summary>
    private string _signString;
     
    /// <summary>
    /// 設(shè)置簽名數(shù)據(jù)
    /// </summary>
    /// <param name="signSource">待簽名的鍵值對</param>
    /// <param name="setting">配置簽名規(guī)則</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("待簽名數(shù)據(jù)異常", 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>
    /// 簽名主體設(shè)置前綴
    /// </summary>
    /// <param name="input">前綴值</param>
    /// <returns></returns>
    public HttpSigner SetSignTextPrefix(string input)
    {
        _signString = $"{input}{_signString}";
        return this;
    }
     
    /// <summary>
    /// 簽名主體設(shè)置后綴
    /// </summary>
    /// <param name="input">后綴值</param>
    /// <returns></returns>
    public HttpSigner SetSignTextSuffix(string input)
    {
        _signString = $"{_signString}{input}";
        return this;
    }
     
    /// <summary>
    /// 簽名主體設(shè)置后綴
    /// </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">簽名結(jié)果是否轉(zhuǎn)小寫</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">簽名結(jié)果是否轉(zhuǎn)小寫</param>
    /// <returns></returns>
    public HttpSigner SetSignTextSHA1(bool isToLower = true)
    {
        if (isToLower)
        {
    _signString = SHA1Utils.GetStringValueToLower(_signString);
        }
        else
        {
    _signString = SHA1Utils.GetStringValueToUpper(_signString);
        }
        return this;
    }
     
    /// <summary>
    /// 獲取簽名結(jié)果
    /// </summary>
    /// <returns></returns>
    public string GetSignResult()
    {
        return _signString;
    }
        }
    }
    

    5、附上倉庫地址

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

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

    標簽: ASP.NET
    主站蜘蛛池模板: 镇江市| 广德县| 靖江市| 新郑市| 淅川县| 永胜县| 龙里县| 琼中| 虹口区| 喀什市| 冀州市| 交城县| 凤城市| 两当县| 繁峙县| 蛟河市| 宁蒗| 新乡市| 沧源| 阳信县| 黄冈市| 綦江县| 玛曲县| 鹤庆县| 息烽县| 湟中县| 资兴市| 新化县| 郧西县| 迭部县| 宜丰县| 高清| 博兴县| 海原县| 邯郸市| 敦煌市| 灌南县| 正安县| 崇义县| 江口县| 高雄市|