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

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

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

瀏覽:175日期: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
    主站蜘蛛池模板: 日本三级香港三级人妇99 | 欧美黑人巨大xxxxxxxx | 怡红院在线视频观看 | 手机在线播放视频 | 亚洲成网站 | 欧美日韩亚洲另类 | 经典香港一级a毛片免费看 精品400部自拍视频在线播放 | 欧美性猛交xxxx免费看手交 | 九九视频精品全部免费播放 | 一级片国产 | ffee性xxⅹ另类老妇hd | 波多野结衣视频免费观看 | 男人操美女 | 成人男女视频 | 久久精品成人一区二区三区 | 制服丝袜在线视频香蕉 | 一区二区三区在线免费观看视频 | 亚洲一区二区三区久久 | 久久综合久久综合九色 | 人久热欧美在线观看量量 | 天天看片天天爽_免费播放 天天看夜夜 | 精品400部自拍视频在线播放 | 欧美白人最猛性xxxxx | 日韩免费专区 | 亚洲一区欧美一区 | 亚洲狠狠狠一区二区三区 | 国产精品大片天天看片 | 一区二区三区日韩 | 亚洲免费专区 | 成人免费看www网址入口 | 亚洲欧美日本人成在线观看 | 亚洲黄色成人 | 久久久高清免费视频 | 欧产日产国产精品精品 | 男女午夜 | 男女超猛烈啪啦啦的免费视频 | 91欧美在线| 美国毛片一级 | 成人精品一区二区三区中文字幕 | 三级毛片网 | 香蕉毛片 |