阿里云 .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可以完美避开获取签名的步骤. 阿里 ...
随机推荐
- antV G2 为柱状图添加背景颜色
工作中需要在基础柱状图的基础上添加一个自定义高度的背景颜色, 基础柱状图: 目标柱状图: 由于chart绘图可以重叠,通过该特性,我们可以在画两次图重叠在一起,第一次绘图描述背景,第二次绘图描述数据, ...
- Java8的Stream方法findAny空指针异常(NullPointerException)实例对比
实战介绍 学习完Java8的Stream方法,可能你正准备大展身手,却发现遇到不少问题,本篇文章为大家带来一个findAny方法抛出java.lang.NullPointerException的场景. ...
- 杂牌机搞机之旅最终章————刷入Xposed框架
杂牌机搞机之旅最终章----刷入Xposed框架 recovery移植不成功,没办法,挂载分区好像挂载不上,所以,刷入magisk如果卡在开机屏,只能线刷解决..心累.. 所以,折腾完XPosed框架 ...
- 2018-8-10-win10-uwp-依赖属性
原文:2018-8-10-win10-uwp-依赖属性 title author date CreateTime categories win10 uwp 依赖属性 lindexi 2018-08-1 ...
- wpf listview images
<ListView x:Name="lv"> <ListView.ItemsPanel> <ItemsPanelTemplate> <St ...
- Razor_06 列表的查询
Razor_06 列表的查询 列表的查询 同步/AJAX 查询 分局部视图[强类型] system.text.Json Ajax 返回 Json 数据 , System.Text.Json .循环引 ...
- int[]里数的个数怎么由输入决定?-----动态数组。
java中如何创建动态数组?(摘自百度知道) Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util ...
- JS中new操作符源码实现
首先我们来看一下实例化一个对象做了浏览器做了什么事情 new的四步操作: 1. 创建一个空对象 2. 设置空对象的__proto__属性继承构造函数的prototype属性,也就是继承构造函数的原型对 ...
- 【React Native】日常踩坑记录_以后将持续更新
作为一名有理想.有抱负的一代iOS程序员,本着“我头发够多,还能学”的原则,我选择了追随那些大佬的脚步,于2018年开始了React Native. 第一步:找文档.准备安装开发环境: 第二步:一步步 ...
- 剑指offer 20:顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...