开发者社区> 问答> 正文

.NET版本的OSS的web直传,一直报签名错误(SignatureDoesNotMatch)

tommmylee 2016-04-26 17:53:06 2406

现有的例子只有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加密方法,但是结果不对。

分享到
取消 提交回答
全部回答(4)
  • Edison Zhou
    2019-07-17 18:48:34

    分享一个基于阿里云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
            };
        }
    0 0
  • stone哥
    2019-07-17 18:48:34

    // 算法参考: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;

    0 0
  • zeego
    2019-07-17 18:48:34

    我也遇到这个问题,头都大了,官方能不能解决一下

    0 0
  • 木洛
    2019-07-17 18:48:33

    这个最好参考OSS API文档里提供的签名字符串和签名后的值,对一下是签名字符串拼错了,还是SHA1等签名算法用错了。

    如果还调试不过,只能发工单找他们的开发来review代码了。

    0 0
添加回答

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题