阿里云 .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可以完美避开获取签名的步骤. 阿里 ...
随机推荐
- Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置
Beats,Logstash负责数据收集与处理.相当于ETL(Extract Transform Load).Elasticsearch负责数据存储.查询.分析.Kibana负责数据探索与可视化分析. ...
- python中反转列表的三种方式
1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...
- python BeautifulSoup 爬虫运行出现 exited with code -1073741571
首先,exited with code -1073741571意思是栈溢出.具体可以看https://blog.csdn.net/vblittleboy/article/details/6613815 ...
- Javase之集合体系之(1)集合顶层类Collection与其迭代器知识
集合体系之集合顶层类Collection与其迭代器知识 集合的由来:Java是一门面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,就必须把多个对象进行存储,而要存 ...
- xml解析-jaxp遍历结点
jaxp遍历结点 把xml中所有的结点都打印出来 // 遍历结点把所有元素名称打印出来 / 1.创建解析器工厂 * 2.根据解析器工厂创建解析器 * 3.解析xml返回document * * 4.得 ...
- Android框架Volley之:利用Imageloader和NetWorkImageView加载图片
首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: < ...
- rust 高级话题
目录 rust高级话题 前言 零大小类型ZST 动态大小类型DST 正确的安装方法 结构体 复制和移动 特征对象 引用.生命周期.所有权 生命周期 错误处理 交叉编译 智能指针 闭包 动态分派和静态分 ...
- SQL Server阻塞的检查
1. 阻塞 除了内存.CPU.I/O这些系统资源以外,阻塞和死锁是影响数据库应用性能的另一大因素. 所谓的「阻塞」,是指当一个数据库会话中的事务,正在锁定其他会话事务想要读取或修改的资源,造成这些 ...
- BayaiM__ oracle函数_02
BayaiM__ oracle函数_02 Oracle中的字符串函数---------------------------------------------------------------- ...
- Linux—使用man命令:man:command not found
# 用echo $PATH查看该环境变量.这种问题一般是环境变量PATH不对的问题. [root@localhost ~]# echo $PATH # 用whereis命令查看,该指令的位置. [ro ...