/// <summary>
        /// Applies the condition for a source blob to the web request.
        /// </summary>
        /// <param name="request">The request to be modified.</param>
        /// <param name="accessCondition">Access condition to be added to the request.</param>
        internal static void ApplyAccessConditionToSource(this HttpRequestMessage request, AccessCondition accessCondition)
        {
            if (accessCondition != null)
            {
                if (!string.IsNullOrEmpty(accessCondition.IfMatchETag))
                {
                    request.Headers.Add(Constants.HeaderConstants.SourceIfMatchHeader, accessCondition.IfMatchETag);
                }

                if (!string.IsNullOrEmpty(accessCondition.IfNoneMatchETag))
                {
                    request.Headers.Add(Constants.HeaderConstants.SourceIfNoneMatchHeader, accessCondition.IfNoneMatchETag);
                }

                if (accessCondition.IfModifiedSinceTime.HasValue)
                {
                    request.Headers.Add(
                        Constants.HeaderConstants.SourceIfModifiedSinceHeader,
                        HttpUtility.ConvertDateTimeToHttpString(accessCondition.IfModifiedSinceTime.Value));
                }

                if (accessCondition.IfNotModifiedSinceTime.HasValue)
                {
                    request.Headers.Add(
                        Constants.HeaderConstants.SourceIfUnmodifiedSinceHeader,
                        HttpUtility.ConvertDateTimeToHttpString(accessCondition.IfNotModifiedSinceTime.Value));
                }

                if (!string.IsNullOrEmpty(accessCondition.LeaseId))
                {
                    throw new InvalidOperationException(SR.LeaseConditionOnSource);
                }
            }
        }
        public void SignRequest(HttpWebRequest request, OperationContext operationContext)
        {
            string dateString = HttpUtility.ConvertDateTimeToHttpString(DateTime.UtcNow);

            request.Headers.Add(Constants.HeaderConstants.Date, dateString);

            if (this.credentials.IsSharedKey)
            {
                // Canonicalize request
                string message = this.canonicalizer.CanonicalizeHttpRequest(request, this.resourceAccountName);

                // Compute hash
                string computedBase64Signature = CryptoUtility.ComputeHmac256(this.credentials.KeyValue, message);

                // Add authorization headers
                if (!string.IsNullOrEmpty(this.credentials.KeyName))
                {
                    request.Headers.Add(Constants.HeaderConstants.KeyNameHeader, this.credentials.KeyName);
                }

                request.Headers.Add(
                    "Authorization",
                    string.Format(CultureInfo.InvariantCulture, "{0} {1}:{2}", this.canonicalizer.AuthorizationScheme, this.credentials.AccountName, computedBase64Signature));
            }
        }
Esempio n. 3
0
        protected override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            string dateString = HttpUtility.ConvertDateTimeToHttpString(DateTimeOffset.UtcNow);

            request.Headers.Add(Constants.HeaderConstants.Date, dateString);

            if (this.credentials.IsSharedKey)
            {
                string message = this.canonicalizer.CanonicalizeHttpRequest(request, this.accountName);

#if RTMD
                string signature = CryptoUtility.ComputeHmac256(this.credentials.KeyValue, message);
#else
                string signature = CryptoUtility.ComputeHmac256(this.credentials.ExportKey(), message);
#endif

                if (!string.IsNullOrEmpty(this.credentials.KeyName))
                {
                    request.Headers.Add(Constants.HeaderConstants.KeyNameHeader, this.credentials.KeyName);
                }

                request.Headers.Authorization = new AuthenticationHeaderValue(
                    this.canonicalizer.AuthorizationScheme,
                    string.Format(CultureInfo.InvariantCulture, "{0}:{1}", this.credentials.AccountName, signature));
            }

            return(base.SendAsync(request, cancellationToken));
        }
        /// <summary>
        /// Applies the condition to the web request.
        /// </summary>
        /// <param name="request">The request to be modified.</param>
        /// <param name="accessCondition">Access condition to be added to the request.</param>
        internal static void ApplyAccessCondition(this HttpWebRequest request, AccessCondition accessCondition)
        {
            if (accessCondition != null)
            {
                if (!string.IsNullOrEmpty(accessCondition.IfMatchETag))
                {
                    request.Headers[HttpRequestHeader.IfMatch] = accessCondition.IfMatchETag;
                }

                if (!string.IsNullOrEmpty(accessCondition.IfNoneMatchETag))
                {
                    request.Headers[HttpRequestHeader.IfNoneMatch] = accessCondition.IfNoneMatchETag;
                }

                if (accessCondition.IfModifiedSinceTime.HasValue)
                {
                    // Not using this property will cause Restricted property exception to be thrown
                    request.IfModifiedSince = accessCondition.IfModifiedSinceTime.Value.UtcDateTime;
                }

                if (accessCondition.IfNotModifiedSinceTime.HasValue)
                {
                    request.Headers[HttpRequestHeader.IfUnmodifiedSince] =
                        HttpUtility.ConvertDateTimeToHttpString(accessCondition.IfNotModifiedSinceTime.Value);
                }

                if (!string.IsNullOrEmpty(accessCondition.LeaseId))
                {
                    request.Headers[Constants.HeaderConstants.LeaseIdHeader] = accessCondition.LeaseId;
                }
            }
        }