连接Lumen自建类S3存储桶时C#代码AWS密钥报错问题
解决第三方S3兼容存储连接报错"The AWS Access Key you provided does not exist in our records"
问题根源
你的代码存在两个关键问题导致报错:
- 未指定第三方存储的自定义端点,AWS SDK默认向AWS官方服务发送请求,自然无法识别第三方的密钥
UploadAsync方法参数传递错误,你把存储端点当成了桶名传入
修正后的代码
以下是适配第三方S3兼容存储的调整后代码:
var jsonObject = listOfStrings; var jsonBytes = JsonSerializer.SerializeToUtf8Bytes(jsonObject); await using var stream = new MemoryStream(jsonBytes); // 配置第三方S3兼容存储的核心参数 var s3Config = new AmazonS3Config { // 设置客户提供的存储端点地址 ServiceURL = _lumenServiceConfiguration.Endpoint, // 根据端点实际协议调整:HTTP设为true,HTTPS设为false UseHttp = false, // 启用路径风格访问(部分第三方存储强制要求此格式) ForcePathStyle = true, // 若第三方存储要求特定签名版本,可按需设置,例如签名版本2: // SignatureVersion = "2" }; // 使用自定义配置初始化S3客户端 var s3Client = new AmazonS3Client( _lumenServiceConfiguration.KeyId, _lumenServiceConfiguration.KeySecret, s3Config); var transferUtility = new TransferUtility(s3Client); // 正确传递参数:流对象、目标桶名、文件名 await transferUtility.UploadAsync(stream, "目标桶名称", "file.json").ConfigureAwait(false);
关键修改说明
AmazonS3Config配置:通过ServiceURL指定第三方存储的实际端点,让SDK向正确的服务发送请求,而非默认的AWS官方节点ForcePathStyle:多数第三方S3兼容存储不支持虚拟主机风格的桶访问(即bucket.endpoint.com),启用路径风格后会采用endpoint.com/bucket的标准格式访问- 参数修正:
UploadAsync的第二个参数是桶名,而非端点,需替换为客户提供的实际存储桶名称
额外注意事项
- 确认端点的协议类型(HTTP/HTTPS),对应调整
UseHttp属性 - 如果仍出现签名相关错误,可尝试切换
SignatureVersion(比如改为"2"),不同第三方存储的签名规则可能存在差异 - 确保所有配置项(密钥、桶名、端点)与Postman中使用的完全一致
内容的提问来源于stack exchange,提问作者JC_Meister
相关产品推荐
相关产品推荐

