[英]Aws sam cognito api gateway - access token forbidden but works if it's from postman
[英]Presigned PUT works from PostMan, but 403 Forbidden from C# HttpClient
我已经使用以下 .Net 代码从 S3 生成了预签名的 url(在具有适当的 IAM 角色/存储桶权限的服务中)
var key = GenerateKey(jobId, batchId);
var linkExpiresAt = _dateTimeService.Now().AddMinutes(_expiryTime);
var request = new GetPreSignedUrlRequest
{
BucketName = _bucketName,
Key = key,
Verb = HttpVerb.PUT,
ContentType = "application/json",
Expires = linkExpiresAt,
ServerSideEncryptionMethod = ServerSideEncryptionMethod.None
};
var url = _s3Client.GetPreSignedURL(request);
我可以在 Postman 中使用这个 url 来执行内容为“JSON”的 PUT,但是当我尝试从代码中使用它时,我得到 403
var content = new StringContent(mooStr, Encoding.ASCII, "application/json");
var fileStreamResponse = await httpClient.PutAsync(
url,
content);
.Net 尝试 PUT 到 url 有什么明显的错误吗?
如果有人遇到同样的问题,我找到了解决方案。
当我运行 Fiddler 时,我捕获了来自 Postman 的成功请求和来自 .Net 代码的失败请求。 我能发现的唯一区别是成功的有这个标题(自从我第一次发帖以来,我已经改为 text/plain,但问题仍然存在):-
内容类型:文本/纯文本
来自.Net的失败者有:-
内容类型:文本/纯文本; 字符集=utf-8
对 StackOverflow 的一些搜索找到了我这些帖子
如何从 HttpClient.PostAsJsonAsync() 生成的 Content-Type 标头中删除 charset=utf8?
使用 HttpClient 时如何不排除 Content-Type 中的字符集?
我在 Fiddler 中编辑了捕获的请求并删除了字符集并且它起作用了。 将我的原始代码更改为以下有效(注意 - 在 StringContent 上设置 text/plain 不起作用):-
var content = new StringContent(mooStr);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("text/plain");
var fileStreamResponse = await httpClient.PutAsync(
Url,
content);
以下代码对我有用(用于发布 IFormFile 类型的文件):
public async Task<bool> UploadObject(string preSignedUrl)
{
try
{
using (var client = new HttpClient())
{
StreamContent streamContent = new StreamContent(file.OpenReadStream());
var result = await client.PutAsync(preSignedUrl, streamContent);
if (result.StatusCode != HttpStatusCode.OK)
{
throw new Exception();
}
}
return true;
}
catch (Exception e)
{
....
}
return false;
}
使用 IAmazonS3 package 创建 preSignedUrl。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.