gpt4 book ai didi

c# - S3 请求时间太偏斜

转载 作者:行者123 更新时间:2023-11-30 14:09:40 25 4
gpt4 key购买 nike

我目前正在使用 C# 构建一个应用程序,该应用程序使用 AWS SDK 将文件上传到 S3。

但是,我有一些用户在应用程序尝试上传文件时收到“请求时间太偏斜”错误。

我知道问题是用户的时钟不同步,但是,很难指望用户更改它,所以我想知道,是否有任何方法可以避免发生此错误(任何 .NET使用 NTP 或类似工具获得准确时间的功能?)

在我用来上传文件的当前代码下方。

var _s3Config = new AmazonS3Config { ServiceURL = "https://s3-eu-west-1.amazonaws.com" };
var _awsCredentials = new SessionAWSCredentials(credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken);
var s3Client = new AmazonS3Client(_awsCredentials, _s3Config);
var putRequest = new PutObjectRequest
{
BucketName = "my.bucket.name",
Key = "/path/to/file.txt",
FilePath = "/path/to/local/file.txt"
};
putRequest.StreamTransferProgress += OnUploadProgress;
var response = await s3Client.PutObjectAsync(putRequest);

最佳答案

从时间服务器获取时间实际上是您挑战中比较容易的部分。据我所知,没有内置的 C# 功能可以从时间服务器获取准确的时间,但快速搜索会为 NTP 客户端生成大量示例代码。我在 dotnet-snippets.com 上找到了一个很好的综合示例(对于您的案例来说可能有点矫枉过正),并且在标题为“How to Query an NTP Server using C#?”的页面中的 Stack Overflow 上找到了一个非常精简的版本.后者看起来对您的情况可能有效,因为您所需要的只是对当前时间的合理准确的了解。

现在开始真正的挑战:将这段时间用于 Amazon S3。首先,介绍一些背景知识,因为理解为什么会发生这种情况很重要。时间偏差限制旨在防止重放攻击,如下所述: http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html

因此,亚马逊在构造 HTTP(S) 请求时将当前时间戳构建到 AWS SDK 中使用的身份验证签名中。但是,SDK 始终使用当前时间(无法在 SDK 方法中覆盖它): https://github.com/aws/aws-sdk-net/blob/master/AWSSDK_DotNet35/Amazon.Runtime/Internal/Auth/AWS3Signer.cs#L119

请注意,在所有情况下,开发工具包都使用 AWSSDKUtils.FormattedCurrentTimestampRFC822 作为时间戳,调用方无法将不同的值传递给方法。

所以这给你留下了两个我可以看到的选项:

  1. 绕过 Amazon SDK 并使用您从 NTP 服务器检索的时间构建您自己的 HTTP 请求。这是可行的,但并不容易。亚马逊不鼓励这种方法,因为 SDK 提供了很多有用的包装器来确保您正确地使用 API 作为一个整体,处理大量繁琐的消息处理,如果您直接使用 HTTP,则必须自己完成这些处理。它还有助于处理大量错误,并确保在传输中断时正确清理内容。

  2. 克隆 Amazon SDK git 存储库并创建您自己的分支并进行修改以允许您传入当前时间。这也很困难,因为您必须想出一种方法将时间向下传递到多个 API 对象层。而且您将失去在新 SDK 可用时轻松更新到新 SDK 的好处。

抱歉,没有简单的答案,但我希望这对您有所帮助。

关于c# - S3 请求时间太偏斜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28001165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com