国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:166日期: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
    主站蜘蛛池模板: 久久成人黄色 | 欧美 另类 精品一区视频 | 看欧美的一级毛片 | 成人国产精品一级毛片了 | 国产欧美一区二区三区在线看 | 中文字幕日韩精品中文区 | 一级看片免费视频 | 91精品一区二区三区在线播放 | 精品在线播放视频 | 美女扒开腿被男人猛视频 | 国产一级在线现免费观看 | 日本三本道 | 国产精品一区伦免视频播放 | 手机看片日韩国产 | 黄色成人免费网站 | 一区二区三区国产精品 | 久久视频精品53在线观看 | 国产91精品一区二区 | 国产一区二区三区免费在线观看 | 国产激情视频在线播放 | 亚洲人成人毛片无遮挡 | 欧美综合自拍亚洲综合百度 | 久久久久爽亚洲精品 | 久久这里有精品视频 | 久久国产三级 | jk制服福利在线播放 | 一级毛片子 | 成年女人毛片免费观看中文w | 男人躁女人躁的好爽免费视频 | 国产成人免费在线视频 | 精品国产亚一区二区三区 | 99av在线 | 国产精品分类视频分类一区 | 免费观看一级成人毛片 | 失禁h啪肉尿出来高h健身房 | 最新精品亚洲成a人在线观看 | 日本免费人成黄页在线观看视频 | 97国内免费久久久久久久久久 | 网站午夜 | 91手机看片国产福利精品 | 伊人色综合久久天天网蜜月 |