开发者社区> 问答> 正文

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

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

展开
收起
tommmylee 2016-04-26 17:53:06 7170 0
5 条回答
写回答
取消 提交回答
  • 从业7年, 参与过几款市场反应不太好的游戏开发, 主要领域为服务端, 酷爱.net语言

    这个问题估计要骂骂写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去做加密!

    2019-12-16 10:18:00
    赞同 3 展开评论 打赏
  • 程序员,阿里云MVP,CSM

    分享一个基于阿里云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
            };
        }
    2019-07-17 18:48:34
    赞同 1 展开评论 打赏
  • 爱折腾的码农,微信公众号「劼哥舍」

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

    2019-07-17 18:48:34
    赞同 展开评论 打赏
  • 我也遇到这个问题,头都大了,官方能不能解决一下

    2019-07-17 18:48:34
    赞同 展开评论 打赏
  • 表格存储(TableStore)技术负责人,专注结构化数据存储领域技术和解决方案。

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

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

    2019-07-17 18:48:33
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载