public static string PreSignedUrl(TemporaryAWSCredentials creds, string fileKey) { string url = ""; //var s3Client = new AmazonS3Client(new SessionAWSCredentials(creds.AccessKeyId, creds.SecretAccessKey, creds.Token))) ResponseHeaderOverrides headerOverrides = new ResponseHeaderOverrides(); headerOverrides.ContentType = "application/pdf"; int secs = 0; do { using (var s3Client = AWSClientFactory.CreateAmazonS3Client(GetAccesskey(), GetSecretkey())) { GetPreSignedUrlRequest request = new GetPreSignedUrlRequest() .WithBucketName(GetBucketname()) .WithKey(fileKey.TrimStart('/')) .WithProtocol(Protocol.HTTP) .WithVerb(HttpVerb.GET) //.WithResponseHeaderOverrides(headerOverrides) .WithExpires(DateTime.Now.AddMinutes(120).AddSeconds(secs)); url = s3Client.GetPreSignedURL(request); secs++; } } while ((url.Contains("%2B") || url.Contains("%2b") || url.Contains("+")) && secs < 30); // try again until a signature with no + sign is generated. return(url); }
public override Uri GetPreSignedUri(string domain, string path, TimeSpan expire, IEnumerable <string> headers) { if (expire == TimeSpan.Zero || expire == TimeSpan.MinValue || expire == TimeSpan.MaxValue) { expire = GetExpire(domain); } if (expire == TimeSpan.Zero || expire == TimeSpan.MinValue || expire == TimeSpan.MaxValue) { return(GetUriShared(domain, path)); } var pUrlRequest = new GetPreSignedUrlRequest { BucketName = _bucket, Expires = DateTime.UtcNow.Add(expire), Key = MakePath(domain, path), Protocol = SecureHelper.IsSecure() ? Protocol.HTTPS : Protocol.HTTP, Verb = HttpVerb.GET }; if (headers != null && headers.Any()) { var headersOverrides = new ResponseHeaderOverrides(); foreach (var h in headers) { if (h.StartsWith("Content-Disposition")) { headersOverrides.ContentDisposition = (h.Substring("Content-Disposition".Length + 1)); } else if (h.StartsWith("Cache-Control")) { headersOverrides.CacheControl = (h.Substring("Cache-Control".Length + 1)); } else if (h.StartsWith("Content-Encoding")) { headersOverrides.ContentEncoding = (h.Substring("Content-Encoding".Length + 1)); } else if (h.StartsWith("Content-Language")) { headersOverrides.ContentLanguage = (h.Substring("Content-Language".Length + 1)); } else if (h.StartsWith("Content-Type")) { headersOverrides.ContentType = (h.Substring("Content-Type".Length + 1)); } else if (h.StartsWith("Expires")) { headersOverrides.Expires = (h.Substring("Expires".Length + 1)); } else { throw new FormatException(string.Format("Invalid header: {0}", h)); } } pUrlRequest.ResponseHeaderOverrides = headersOverrides; } return(MakeUri(GetClient().GetPreSignedURL(pUrlRequest))); }
public Uri Create(RequestContext requestContext) { Ensure.ToBeTrue(ExpireTime > DateTime.UtcNow); Ensure.ToBeTrue(HttpMethod == HttpMethod.Get || HttpMethod == HttpMethod.Put, "不支持的http method"); //只支持这两种 var method = HttpMethod.ToString().ToUpperInvariant(); var expire = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds.ToString(); //UNIX 时间戳 // 要额外签名的数据 var headers = new Dictionary <string, string>(); if (UserMetadata != null) { foreach (var pair in UserMetadata) { headers.Add(OssHeaders.OssUserMetaPrefix + pair.Key, pair.Value); } } var canonicalHeaders = SignatureHelper.ComputeCanonicalizedOSSHeaders(headers); //? 以STS获得的AccessKeyId和AccessKeySecret发送时,是否考虑SecurityToken的处理? // var parameters = new Dictionary <string, string>(); if (requestContext.OssCredential.UseToken) { parameters.Add(RequestParameters.SECURITY_TOKEN, requestContext.OssCredential.SecurityToken); } ResponseHeaderOverrides?.Populate(parameters); var canonicalResource = SignatureHelper.BuildCanonicalizedResource(Bucket, ObjectKey, parameters); //var canonicalResource = "/" + (Bucket ?? "") + ((ObjectKey != null ? "/" + ObjectKey : "")); //签名 var sign = SignatureHelper.HmacSha1Sign(requestContext.OssCredential.AccessKeySecret, method, ContentMd5, ContentType, expire, canonicalHeaders, canonicalResource); // URL 参数 var urlParams = new Dictionary <string, string>(); urlParams.Add(RequestParameters.EXPIRES, expire); urlParams.Add(RequestParameters.OSS_ACCESS_KEY_ID, requestContext.OssCredential.AccessKeyId); urlParams.Add(RequestParameters.SIGNATURE, sign); foreach (var pair in parameters) { urlParams.Add(pair.Key, pair.Value); } var queryString = HttpUtils.CombineQueryString(urlParams); // 生成最终的URI var uriString = Bucket.GetObjectUrl(ObjectKey) + "?" + queryString; return(new Uri(uriString)); }
public string GetBlobSasUrl(string containerName, string blobName, DateTimeOffset expiry, bool isDownload = false, string fileName = null, string contentType = null, BlobUrlAccess access = BlobUrlAccess.Read) { var headers = new ResponseHeaderOverrides(); ContentDispositionHeaderValue cdHeader; if (isDownload) { cdHeader = new ContentDispositionHeaderValue("attachment"); } else { cdHeader = new ContentDispositionHeaderValue("inline"); } if (!string.IsNullOrEmpty(fileName)) { cdHeader.FileNameStar = fileName; } headers.ContentDisposition = cdHeader.ToString(); if (!string.IsNullOrEmpty(contentType)) { headers.ContentType = contentType; } var urlRequest = new GetPreSignedUrlRequest { BucketName = _bucket, Key = GenerateKeyName(containerName, blobName), Expires = expiry.UtcDateTime, ResponseHeaderOverrides = headers, Verb = access == BlobUrlAccess.Read ? HttpVerb.GET : HttpVerb.PUT }; if (!string.IsNullOrEmpty(_serverSideEncryptionMethod)) { urlRequest.ServerSideEncryptionMethod = _serverSideEncryptionMethod; } try { return(_s3Client.GetPreSignedURL(urlRequest)); } catch (AmazonS3Exception asex) { throw asex.ToStorageException(); } }
public GetObjectParams(ResponseHeaderOverrides overrideHeaders = null, ObjectRange range = null, DateTime?ifModifiedSinceUtc = null, DateTime?ifUnmodifiedSinceUtc = null, string ifEtagMatch = "", string ifEtagNoneMatch = "") { OverrideResponseHeaders = OverrideResponseHeaders; Range = range; IfModifiedSince = ifModifiedSinceUtc; IfUnmodifiedSince = IfUnmodifiedSince; IfEtagMatch = ifEtagMatch; IfEtagNoneMatch = ifEtagNoneMatch; }
async Task <GetObjectResponse> GetS3Object(string bucketName, string keyName) { using (var client = new AmazonS3Client(RegionEndpoint.USEast1)) { var request = new GetObjectRequest { BucketName = bucketName, Key = keyName }; ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides(); responseHeaders.CacheControl = "No-cache"; request.ResponseHeaderOverrides = responseHeaders; return(await client.GetObjectAsync(request)); } }
public async Task <GetObjectResponse> DownloadFileAsync(string keyName) { GetObjectRequest request = new GetObjectRequest { BucketName = BucketName, Key = keyName }; ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides { CacheControl = "No-cache", ContentDisposition = "attachment; filename=testing.txt" }; request.ResponseHeaderOverrides = responseHeaders; return(await amazonS3Client.GetObjectAsync(request)); }
public string GetBlobSasUrl(string containerName, string blobName, DateTimeOffset expiry, bool isDownload = false, string fileName = null, string contentType = null, BlobUrlAccess access = BlobUrlAccess.Read) { var headers = new ResponseHeaderOverrides(); if (isDownload) { headers.ContentDisposition = "attachment;"; } if (!string.IsNullOrEmpty(fileName)) { headers.ContentDisposition += "filename=\"" + fileName + "\""; } if (!string.IsNullOrEmpty(contentType)) { headers.ContentType = contentType; } var urlRequest = new GetPreSignedUrlRequest() { BucketName = _bucket, Key = GenerateKeyName(containerName, blobName), Expires = expiry.UtcDateTime, ResponseHeaderOverrides = headers, Verb = access == BlobUrlAccess.Read ? HttpVerb.GET : HttpVerb.PUT }; try { return(_s3Client.GetPreSignedURL(urlRequest)); } catch (AmazonS3Exception asex) { if (IsInvalidAccessException(asex)) { throw new StorageException(1000.ToStorageError(), asex); } else { throw new StorageException(1001.ToStorageError(), asex); } } }
public IRequest Marshall(GetObjectRequest getObjectRequest) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown if (string.IsNullOrEmpty(getObjectRequest.Key)) { throw new ArgumentException("Key is a required property and must be set before making this call.", "GetObjectRequest.Key"); } IRequest val = new DefaultRequest(getObjectRequest, "AmazonS3"); val.set_HttpMethod("GET"); if (getObjectRequest.IsSetEtagToMatch()) { val.get_Headers().Add("If-Match", S3Transforms.ToStringValue(getObjectRequest.EtagToMatch)); } if (getObjectRequest.IsSetModifiedSinceDate()) { val.get_Headers().Add("If-Modified-Since", S3Transforms.ToStringValue(getObjectRequest.ModifiedSinceDate)); } if (getObjectRequest.IsSetEtagToNotMatch()) { val.get_Headers().Add("If-None-Match", S3Transforms.ToStringValue(getObjectRequest.EtagToNotMatch)); } if (getObjectRequest.IsSetUnmodifiedSinceDate()) { val.get_Headers().Add("If-Unmodified-Since", S3Transforms.ToStringValue(getObjectRequest.UnmodifiedSinceDate)); } if (getObjectRequest.IsSetByteRange()) { val.get_Headers().Add("Range", getObjectRequest.ByteRange.FormattedByteRange); } if (getObjectRequest.IsSetServerSideEncryptionCustomerMethod()) { val.get_Headers().Add("x-amz-server-side-encryption-customer-algorithm", ConstantClass.op_Implicit(getObjectRequest.ServerSideEncryptionCustomerMethod)); } if (getObjectRequest.IsSetServerSideEncryptionCustomerProvidedKey()) { val.get_Headers().Add("x-amz-server-side-encryption-customer-key", getObjectRequest.ServerSideEncryptionCustomerProvidedKey); if (getObjectRequest.IsSetServerSideEncryptionCustomerProvidedKeyMD5()) { val.get_Headers().Add("x-amz-server-side-encryption-customer-key-MD5", getObjectRequest.ServerSideEncryptionCustomerProvidedKeyMD5); } else { val.get_Headers().Add("x-amz-server-side-encryption-customer-key-MD5", AmazonS3Util.ComputeEncodedMD5FromEncodedString(getObjectRequest.ServerSideEncryptionCustomerProvidedKey)); } } if (getObjectRequest.IsSetRequestPayer()) { val.get_Headers().Add(S3Constants.AmzHeaderRequestPayer, S3Transforms.ToStringValue(((object)getObjectRequest.RequestPayer).ToString())); } val.set_ResourcePath(string.Format(CultureInfo.InvariantCulture, "/{0}/{1}", S3Transforms.ToStringValue(getObjectRequest.BucketName), S3Transforms.ToStringValue(getObjectRequest.Key))); ResponseHeaderOverrides responseHeaderOverrides = getObjectRequest.ResponseHeaderOverrides; if (responseHeaderOverrides.CacheControl != null) { val.get_Parameters().Add("response-cache-control", S3Transforms.ToStringValue(responseHeaderOverrides.CacheControl)); } if (responseHeaderOverrides.ContentDisposition != null) { val.get_Parameters().Add("response-content-disposition", S3Transforms.ToStringValue(responseHeaderOverrides.ContentDisposition)); } if (responseHeaderOverrides.ContentEncoding != null) { val.get_Parameters().Add("response-content-encoding", S3Transforms.ToStringValue(responseHeaderOverrides.ContentEncoding)); } if (responseHeaderOverrides.ContentLanguage != null) { val.get_Parameters().Add("response-content-language", S3Transforms.ToStringValue(responseHeaderOverrides.ContentLanguage)); } if (responseHeaderOverrides.ContentType != null) { val.get_Parameters().Add("response-content-type", S3Transforms.ToStringValue(responseHeaderOverrides.ContentType)); } if (getObjectRequest.IsSetResponseExpires()) { val.get_Parameters().Add("response-expires", S3Transforms.ToStringValue(getObjectRequest.ResponseExpires)); } if (getObjectRequest.IsSetVersionId()) { val.AddSubResource("versionId", S3Transforms.ToStringValue(getObjectRequest.VersionId)); } if (getObjectRequest.IsSetPartNumber()) { val.AddSubResource("partNumber", S3Transforms.ToStringValue(getObjectRequest.PartNumber.Value)); } val.set_UseQueryString(true); return(val); }