public void Authenticate(RestSharp.IRestClient client, RestSharp.IRestRequest request) { DateTime signingDate = DateTime.UtcNow; SetContentMd5(request); SetContentSha256(request); SetHostHeader(request, client); SetDateHeader(request, signingDate); SortedDictionary <string, string> headersToSign = GetHeadersToSign(request); string signedHeaders = GetSignedHeaders(headersToSign); string canonicalRequest = GetCanonicalRequest(client, request, headersToSign); byte[] canonicalRequestBytes = System.Text.Encoding.UTF8.GetBytes(canonicalRequest); string canonicalRequestHash = BytesToHex(ComputeSha256(canonicalRequestBytes)); string stringToSign = GetStringToSign(Region, signingDate, canonicalRequestHash); byte[] signingKey = GenerateSigningKey(Region, signingDate); byte[] stringToSignBytes = System.Text.Encoding.UTF8.GetBytes(stringToSign); byte[] signatureBytes = SignHmac(signingKey, stringToSignBytes); string signature = BytesToHex(signatureBytes); string authorization = GetAuthorizationHeader(signedHeaders, signature, signingDate, Region); request.AddHeader("Authorization", authorization); }
public string PresignURL(RestSharp.IRestClient client, RestSharp.IRestRequest request, int expires) { DateTime signingDate = DateTime.UtcNow; string requestQuery = ""; string path = request.Resource; requestQuery = "X-Amz-Algorithm=AWS4-HMAC-SHA256&"; requestQuery += "X-Amz-Credential=" + this.AccessKeyId + Uri.EscapeDataString("/" + GetScope(Region, signingDate)) + "&"; requestQuery += "X-Amz-Date=" + signingDate.ToString("yyyyMMddTHHmmssZ") + "&"; requestQuery += "X-Amz-Expires=" + expires + "&"; requestQuery += "X-Amz-SignedHeaders=host"; string canonicalRequest = GetPresignCanonicalRequest(client, request, requestQuery); byte[] canonicalRequestBytes = System.Text.Encoding.UTF8.GetBytes(canonicalRequest); string canonicalRequestHash = BytesToHex(ComputeSha256(canonicalRequestBytes)); string stringToSign = GetStringToSign(Region, signingDate, canonicalRequestHash); byte[] signingKey = GenerateSigningKey(Region, signingDate); byte[] stringToSignBytes = System.Text.Encoding.UTF8.GetBytes(stringToSign); byte[] signatureBytes = SignHmac(signingKey, stringToSignBytes); string signature = BytesToHex(signatureBytes); // Return presigned url. return(client.BaseUrl + path + "?" + requestQuery + "&X-Amz-Signature=" + signature); }
private string GetCanonicalRequest(RestSharp.IRestClient client, RestSharp.IRestRequest request, SortedDictionary <string, string> headersToSign) { LinkedList <string> canonicalStringList = new LinkedList <string>(); canonicalStringList.AddLast(request.Method.ToString()); if (!string.IsNullOrWhiteSpace(request.Resource)) { string[] path = request.Resource.Split(new char[] { '?' }, 2); if (!path[0].StartsWith("/")) { path[0] = "/" + path[0]; } canonicalStringList.AddLast(path[0]); string query = ""; if (path.Length == 2) { var parameterString = path[1]; var parameterList = parameterString.Split('&'); SortedSet <string> sortedQueries = new SortedSet <string>(); foreach (string individualParameterString in parameterList) { if (individualParameterString.Contains('=')) { string[] splitQuery = individualParameterString.Split(new char[] { '=' }, 2); sortedQueries.Add(splitQuery[0] + "=" + splitQuery[1]); } else { sortedQueries.Add(individualParameterString + "="); } } query = string.Join("&", sortedQueries); } canonicalStringList.AddLast(query); } foreach (string header in headersToSign.Keys) { canonicalStringList.AddLast(header + ":" + headersToSign[header]); } canonicalStringList.AddLast(""); canonicalStringList.AddLast(string.Join(";", headersToSign.Keys)); if (headersToSign.Keys.Contains("x-amz-content-sha256")) { canonicalStringList.AddLast(headersToSign["x-amz-content-sha256"]); } else { canonicalStringList.AddLast("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); } return(string.Join("\n", canonicalStringList)); }
private string GetPresignCanonicalRequest(RestSharp.IRestClient client, RestSharp.IRestRequest request, string requestQuery) { LinkedList <string> canonicalStringList = new LinkedList <string>(); canonicalStringList.AddLast(request.Method.ToString()); string path = request.Resource; if (!path.StartsWith("/")) { path = "/" + path; } canonicalStringList.AddLast(path); canonicalStringList.AddLast(requestQuery); canonicalStringList.AddLast("host:" + client.BaseUrl.Host); canonicalStringList.AddLast(""); canonicalStringList.AddLast("host"); canonicalStringList.AddLast("UNSIGNED-PAYLOAD"); return(string.Join("\n", canonicalStringList)); }
public void Authenticate(RestSharp.IRestClient client, RestSharp.IRestRequest request) { request.AddHeader("Authorization", "Bearer " + _accessToken); }
private void SetHostHeader(RestSharp.IRestRequest request, RestSharp.IRestClient client) { request.AddHeader("Host", client.BaseUrl.Host + (client.BaseUrl.Port != 80 ? ":" + client.BaseUrl.Port : string.Empty)); }
private static bool IsValidBaseUrl(RestSharp.IRestClient client, SDK.Http.IHttpRequest request) { return(request.CanonicalUri .ToString() .Contains(client.BaseUrl.ToString())); }