阿里云 .NET SDK Roa 和 Rpc 风格签名
阿里云 .NET SDK Roa 和 Rpc 风格的签名 Demo,适用于自己不想用其提供的SDK,想用自己组装 Roa 和 Rpc 的签名方式。
Roa 和 Rpc 的签名方式主要有以下几个不同点:
- 两者 Header 中的分割方式, Roa 的使用的是 “\n” ,Rpc 使用的是 "&"。
- Rpc 中主要在于 组装 Query 的过程,而 Roa 在于 Header 的拼接上。
- 其次就是 siganture 计算方式的不同。
Roa 的核心逻辑代码如下:
StringToSign 的逻辑
public override string ComposeStringToSign(IDictionary<string, string> headers)
{
var sb = new StringBuilder();
sb.Append(MethodType).Append(HeaderSeparator);
if (headers.ContainsKey("Accept")) sb.Append(headers["Accept"]);
sb.Append(HeaderSeparator);
if (headers.ContainsKey("Content-MD5")) sb.Append(headers["Content-MD5"]);
sb.Append(HeaderSeparator);
if (headers.ContainsKey("Content-Type")) sb.Append(headers["Content-Type"]);
sb.Append(HeaderSeparator);
if (headers.ContainsKey("Date")) sb.Append(headers["Date"]);
sb.Append(HeaderSeparator);
var uri = ReplaceOccupiedParameters(UrlPattern, Paths);
sb.Append(BuildCanonicalHeaders(headers, "x-acs-", HeaderSeparator));
sb.Append(BuildQuerystring(uri, Queries, QuerySeparator));
return sb.ToString();
}
Rpc 的 StringToSign 逻辑:
public override string ComposeStringToSign(IDictionary<string, string> queries)
{
var tempQueries = new Dictionary<string, string>(queries);
var sortedDictionary = new SortedDictionary<string, string>(tempQueries, StringComparer.Ordinal);
var headerQueryString = new StringBuilder();
foreach (var item in sortedDictionary)
headerQueryString.Append(HeaderSeparator)
.Append(SignatureHelper.ValueEncode(item.Key))
.Append("=")
.Append(SignatureHelper.ValueEncode(item.Value));
var stringToSign = new StringBuilder();
stringToSign.Append(MethodType);
stringToSign.Append(HeaderSeparator);
stringToSign.Append(SignatureHelper.ValueEncode("/"));
stringToSign.Append(HeaderSeparator);
stringToSign.Append(SignatureHelper.ValueEncode(headerQueryString.ToString().Substring(1)));
return stringToSign.ToString();
}
最后使用的 signature 使用 HMACSHA1 算法 与 相应的 AccessKeySecret 进行加密:
public static string ComputeSignature(string stringToSign, string accessKeySecret)
{
using (var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(accessKeySecret)))
{
var hashValue = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
return Convert.ToBase64String(hashValue);
}
}
源码以及demo 地址: https://github.com/doublnt/aliyun-csharp-signature
阿里云 .NET SDK Roa 和 Rpc 风格签名的更多相关文章
- 阿里云 OCS SDK for NodeJS介绍
阿里云 OCS SDK for NodeJS介绍 阿里云技术团队:熊亮 阿里云 SDK for NodeJS 是为 NodeJS 开发者提供使用阿里云各项服务的统一入口,由阿里云UED团队负责开发维护 ...
- 使用阿里云Python SDK管理ECS安全组
准备工作 本机操作系统:CentOS7 python版本:python2.7.5 还需要准备如下信息: 一个云账号.Access Key ID.Access Key Secret.安全组ID.Regi ...
- 快速上手阿里云oss SDK
使用阿里云oss SDK 依赖安装: pip install oss2 pip install aliyun-python-sdk-sts 版本最好是 2.7.5 或以上 如果要开启 crc64 循环 ...
- 揭秘阿里云 RTS SDK 是如何实现直播降低延迟和卡顿
作者:予涛 途坦 这个夏天,没什么能够比一场酣畅淋漓的奥运比赛来的过瘾.但是,在视频平台直播观看比赛也有痛点:"卡顿" 和 "延时".受限于不同地域.复杂的网络 ...
- 阿里云直播SDK - .NET
阿里云sdk:https://develop.aliyun.com/sdk/csharp?spm=5176.doc27234.2.4.QiJb9l Github:https://github.com/ ...
- thinkPHP中怎么使用阿里云的sdk
使用阿里云官方给的方法总会报错 Class 'Home\Controller\DefaultProfile' not found 这样是因为namespace的原因,将aliyun sdk 放在con ...
- 使用阿里云Java SDK 实现 DDNS
本代码的实现前提: 1.拥有阿里云域名,且获取了Access Key 及 Access Secret 2.能获取外网IP的页面地址(注意:ip138.com的实际包含ip地址为http://2018. ...
- 阿里云OSS-web直传---在服务端c#签名,浏览器直传
OSS web直传---在服务端php签名,浏览器直传 本文:OSS web直传---在服务端c#签名,浏览器直传 其他语言的范例地址:https://help.aliyun.com/document ...
- 通过SDK和API获取阿里云RDS的监控数据
阿里云的RDS自带的监控系统获取数据不怎么直观,想要通过API获取数据通过zabbix显示,因为网上资料缺乏和其他一些原因,获取API签名很困难,但使用阿里云的SDK可以完美避开获取签名的步骤. 阿里 ...
随机推荐
- ASP.NET(1)
1.IIS安装问题,先装VS再装IIS,处理程序映射有问题,使用VS自带的控制台输入命令,注册路径 2.开发模式,一般处理程序,使用IO操作读取html文件,使前后端分离 3.post请求和get请求 ...
- 终于我还是没忍住,用Python爬了一波女神
你学爬虫,最终不还是为了爬妹子 啥也不说,开始福利赠送~ 女神大会 不是知道有多少人知道“懂球帝”这个 APP(网站),又有多少人关注过它的一个栏目“女神大会”,在这里,没有足球,只有女神哦. 画风是 ...
- MySQL学习——操作自定义函数
MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...
- PHP面试题2019年阿里巴巴面试题及答案解析
一.单选题(共27题,每题5分) 1.Memcache与Redis的比较错误的是? A.Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据: B.Mem ...
- DevExpress的下拉框控件ComboBoxEdit控件的使用
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
- 熟悉的味道——从Java单例写到C++单例
设计模式中,单例模式是常见的一种.单例模式需要满足以下两个条件: 保证一个类只能创建一个示例: 提供对该实例的全局访问点. 关于单例最经典的问题就是DCL(Double-Checked Lock),今 ...
- 如何在Appium中使用AI定位
当我们在写自动化测试脚本的时候,传统情况下一定要知道元素的属性,如id.name.class等.那么通过AI的方式定位元素可能就不需要知道元素的属性,评价人对元素的判断来定位,比如,看到一个搜索框,直 ...
- 将select 转为json
CREATE PROCEDURE[dbo].[WXSP_SerializeJSON](@ParameterSQL AS VARCHAR(MAX))ASBEGIN DECLARE @SQL NVARCH ...
- Mysql双主加Keepalived+读写分离
一.MySQL于keepalived简介** 前言: 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要 ...
- Matplotlib Date Index Formatter 日期索引格式化学习
官方网站:https://matplotlib.org/gallery/ticks_and_spines/date_index_formatter2.html#sphx-glr-gallery-tic ...