免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

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

1、初衷開發(fā)中經(jīng)常需要做一些接口的簽名生成和校驗工作 , 最開始的時候都是每個接口去按照約定單獨實現(xiàn) , 久而久之就變的非常難維護 , 因此就琢磨怎么能夠?qū)懥艘粋€比較通用的簽名生成工具 。
2、思路【通用 HTTP 簽名組件的另類實現(xiàn)】采用鏈式調(diào)用的方式 , 使得簽名的步驟可以動態(tài)拼湊組合 。
3、直接看效果//設置數(shù)據(jù)源var signSource = new Dictionary<string, string>(){{ "param1", "1" },{ "param3", "3+" },{ "param2", "2" }};var signer = new HttpSigner();signer.SetSignData(signSource);//設置數(shù)據(jù)源并配置規(guī)則signer.SetSignData(signSource, setting =>{//按參數(shù)名排序//result --> param1 param2 param3setting.IsOrderByWithKey = false;//是否對簽名數(shù)據(jù)的參數(shù)值進行UrlEncodesetting.IsDoUrlEncodeForSourceValue = https://www.huyubaike.com/biancheng/false;//簽名主體是否包含參數(shù)名setting.IsSignTextContainKey = true;//簽名主體中參數(shù)和參數(shù)值的連接符(需要啟用IsSignTextContainKey)setting.SignTextKeyValueSeparator ="=";//簽名主體中不同參數(shù)項的連接符setting.SignTextItemSeparator = "&";//以上都開啟后--> param1=1&param2=2&param3=3//編碼setting.DefaultEncoding = Encoding.UTF8;});//簽名主體設置前綴signer.SetSignData(signSource).SetSignTextPrefix("TestPrefix");//簽名主體設置后綴signer.SetSignData(signSource).SetSignTextSuffix("TestSuffix");//簽名主體進行Base64signer.SetSignData(signSource).SetSignTextBase64();//簽名主體進行MD5,(方法參數(shù)為簽名結果是否轉(zhuǎn)小寫)signer.SetSignData(signSource).SetSignTextMD5(bool isToLower = true);//簽名主體進行SHA1,(方法參數(shù)為簽名結果是否轉(zhuǎn)小寫)signer.SetSignData(signSource).SetSignTextSHA1(bool isToLower = true);//獲取簽名結果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 = https://www.huyubaike.com/biancheng/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)絡請求簽名工具/// </summary>public class HttpSigner{/// <summary>/// 簽名配置/// </summary>private readonly HttpSignSetting _setting = new HttpSignSetting();/// <summary>/// 最終的簽名串/// </summary>private string _signString;/// <summary>/// 設置簽名數(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 = https://www.huyubaike.com/biancheng/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">簽名結果是否轉(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">簽名結果是否轉(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>/// 獲取簽名結果/// </summary>/// <returns></returns>public string GetSignResult(){return _signString;}}}

經(jīng)驗總結擴展閱讀