现有的例子只有JAVA和PHP版本,依葫芦画瓢的写了一个.NET版本,但是一直报错,错误详情是:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
应该是请求的签名不正确,但是JAVA版本里是有calculatePostSignature方法的,而.NET版本则没有这个方法
只能手动写了一个SHA1加密方法,但是结果不对。
这个问题估计要骂骂写java版本demo的人了. 上java代码段:
String postPolicy = client.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = client.calculatePostSignature(postPolicy);
注意看calculatePostSignature方法传入的参数, 感情前面搞了一堆toBase64,这里传的竟然还是原postPolicy字符串. 然而如果你改装成.net了,就千万记得这里要用encodedPolicy去做加密!
分享一个基于阿里云OSS SDK来生成签名的方法代码示例,供参考:
/// <summary>
/// 生成浏览器端签名
/// </summary>
/// <param name="dir">上传的目标文件夹</param>
/// <returns>签名信息</returns>
public OssSignature SignGen(string dir)
{
var now = DateTime.Now;
var ex = now.AddMinutes(30);
var policyCods = new PolicyConditions();
policyCods.AddConditionItem("content-length-range", 0L, 1048576000L);
policyCods.AddConditionItem(MatchMode.StartWith, "key", dir);
var postPolicy = _ossClient.GeneratePostPolicy(ex, policyCods);
var binaryData = Encoding.Default.GetBytes(postPolicy);
var encodedPolicy = Convert.ToBase64String(binaryData);
var hmac = new HMACSHA1(Encoding.UTF8.GetBytes("你的AccessKeySecret"));
var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(encodedPolicy));
var signature = Convert.ToBase64String(hashBytes);
DateTime startTime = CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
return new OssSignature
{
AccessId = XdpOssConfig.AliyunOssConfig.AccessKeyId,
Policy = encodedPolicy,
Signature = signature,
Dir = dir,
EndPoint = XdpOssConfig.AliyunOssConfig.EndPoint,
Expire = (long)(ex - startTime).TotalMilliseconds
};
}
// 算法参考:https://help.aliyun.com/document_detail/27135.html?spm=5176.8232292.domaindetail.19.IN2iTT
// 核心代码如下,可以参考一下:
var timestamp = (int)(expireDate - new DateTime(1970, 1, 1)).TotalSeconds;
var rand = new Random().Next();
var md5Value = GetMd5(string.Format("/{0}-{1}-{2}-{3}-{4}", key, timestamp, rand, 0, privateKey));
cdnUrl += string.Format("&auth_key={0}-{1}-{2}-{3}", timestamp, rand, 0, md5Value);
return cdnUrl;
这个最好参考OSS API文档里提供的签名字符串和签名后的值,对一下是签名字符串拼错了,还是SHA1等签名算法用错了。
如果还调试不过,只能发工单找他们的开发来review代码了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。