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

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

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

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

    1、初衷

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

    2、思路

    采用鏈?zhǔn)秸{(diào)用的方式,使得簽名的步驟可以動(dòng)態(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;
     
    //是否對(duì)簽名數(shù)據(jù)的參數(shù)值進(jìn)行UrlEncode
    setting.IsDoUrlEncodeForSourceValue = false;
     
    //簽名主體是否包含參數(shù)名
    setting.IsSignTextContainKey = true;
    //簽名主體中參數(shù)和參數(shù)值的連接符(需要啟用IsSignTextContainKey)
    setting.SignTextKeyValueSeparator = "=";
    //簽名主體中不同參數(shù)項(xiàng)的連接符
    setting.SignTextItemSeparator = "&";
    //以上都開啟后  --> param1=1&param2=2&param3=3
     
    //編碼
    setting.DefaultEncoding = Encoding.UTF8;
        });
     
        //簽名主體設(shè)置前綴
        signer.SetSignData(signSource).SetSignTextPrefix("TestPrefix");
     
        //簽名主體設(shè)置后綴
        signer.SetSignData(signSource).SetSignTextSuffix("TestSuffix");
     
        //簽名主體進(jìn)行Base64
        signer.SetSignData(signSource).SetSignTextBase64();
     
        //簽名主體進(jìn)行MD5,(方法參數(shù)為簽名結(jié)果是否轉(zhuǎn)小寫)
        signer.SetSignData(signSource).SetSignTextMD5(bool isToLower = true);
     
        //簽名主體進(jìn)行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、代碼實(shí)現(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ù)名進(jìn)行排序
    /// </summary>
    public bool IsOrderByWithKey { get; set; } = false;
     
    /// <summary>
    /// 是否對(duì)簽名數(shù)據(jù)的參數(shù)值進(jìn)行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ù)項(xiàng)的連接符
    /// </summary>
    public string SignTextItemSeparator { get; set; } = "&";
     
    /// <summary>
    /// 編碼
    /// </summary>
    public Encoding DefaultEncoding { get; set; } = Encoding.UTF8;
        }
    }

    HttpSigner類

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

    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace JiuLing.CommonLibs.Security.HttpSign
    {
        /// <summary>
        /// 網(wǎng)絡(luò)請(qǐng)求簽名工具
        /// </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">待簽名的鍵值對(duì)</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>
    /// 簽名主體進(jìn)行Base64
    /// </summary>
    /// <returns></returns>
    public HttpSigner SetSignTextBase64()
    {
        _signString = Base64Utils.GetStringValue(_signString);
        return this;
    }
     
    /// <summary>
    /// 簽名主體進(jìn)行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>
    /// 簽名主體進(jìn)行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 簽名組件的另類實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)HTTP 簽名組件內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: ASP.NET
    主站蜘蛛池模板: 亚洲美女视频免费 | 久久亚洲国产 | 亚洲综合a | 久久久久久亚洲精品不卡 | 亚洲国产一区在线 | 就草草在线观看视频 | 亚洲欧美精品中文字幕 | 97精品国产高清在线看入口 | 亚洲欧美日本在线 | 久久高清一级毛片 | 欧美成人观看免费完全 | 国产日韩欧美一区二区 | 欧美成人26uuu欧美毛片 | 欧美成人精品在线 | 亚洲一区三区 | 午夜精品久久久久久91 | 她也啪在线视频精品网站 | 欧美另类精品一区二区三区 | 中文字幕在线观看一区二区三区 | 欧美日韩综合精品一区二区三区 | 一级毛片免费观看视频 | 欧美三级做爰全过程 | 美女被免费网站在线视频软件 | 欧美日韩综合精品一区二区三区 | 国产精品国产高清国产专区 | 欧美性群另类交 | 欧美性色生活片免费播放 | 精品国产看高清国产毛片 | 亚洲成a人片在线播放 | 亚洲天堂色网站 | 一级a做爰片欧欧美毛片4 | 一级网站在线观看 | 国产日产欧产精品精品推荐在线 | 久久久亚洲精品蜜桃臀 | 亚欧成人毛片一区二区三区四区 | 好吊妞国产欧美日韩视频 | 国产片在线天堂av | 欧美成人aaa大片 | 欧美一级特黄aa大片在线观看免费 | 亚洲欧美中文日韩二区一区 | 免费一级欧美大片在线观看 |