Пример #1
0
    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);
    }
Пример #2
0
        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)));
        }
Пример #3
0
        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();
            }
        }
Пример #5
0
 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;
 }
Пример #6
0
        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));
            }
        }
Пример #7
0
        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));
        }
Пример #8
0
        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);
                }
            }
        }
Пример #9
0
        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);
        }