Error 403 when trying to Update Entity in Azure Table Storage using IHttpClientFactory

Kanchan Kaushal 1 Reputation point
2022-07-21T16:11:02.27+00:00

Error: "Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature."

   public async Task<string> UpdateEntityAsync(string department, string id, EmployeeDetails employee)  
           {  
               string storageAccount = "sample";  
               string resourcePath = "SampleAzureTableStorage";  
               string accessKey = "<Sample>";  
               string uri = @"https://" + storageAccount + ".table.core.windows.net/" + resourcePath + "(PartitionKey='" + department + "',RowKey='" + id + "')";  
               var request = _httpClientFactory.CreateClient();  
               request = getRequestHeadersPut("PUT", request, storageAccount, accessKey, resourcePath, department, id);  
     
               try  
               {  
                   var httpResponseMessage = await request.PutAsync<EmployeeDetails>(uri, employee, new JsonMediaTypeFormatter());  
                   if (httpResponseMessage.IsSuccessStatusCode)  
                   {  
                       return "Success";  
                   }  
                   return null;  
               }  
               catch (WebException ex)  
               {  
                   throw ex;  
               }  
     
           }  
           public HttpClient getRequestHeadersPut(string requestType, HttpClient Newrequest, string storageAccount, string accessKey, string resource,string department, string id, int Length = 0)  
           {  
               HttpClient Client = Newrequest;  
     
               var RequestDateString = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);  
               if (Client.DefaultRequestHeaders.Contains("x-ms-date"))  
                   Client.DefaultRequestHeaders.Remove("x-ms-date");  
               Client.DefaultRequestHeaders.Add("x-ms-date", RequestDateString);  
     
               var requestUri = @"https://" + storageAccount + ".table.core.windows.net/" + resource + "(PartitionKey='" + department + "',RowKey='" + id + "')";  
     
               Client.DefaultRequestHeaders.Accept.Clear();  
               Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  
     
               if (Client.DefaultRequestHeaders.Contains("x-ms-version"))  
                   Client.DefaultRequestHeaders.Remove("x-ms-version");  
     
               Client.DefaultRequestHeaders.Add("x-ms-version", "2015-12-11");  
     
               if (Client.DefaultRequestHeaders.Contains("DataServiceVersion"))  
                   Client.DefaultRequestHeaders.Remove("DataServiceVersion");  
               Client.DefaultRequestHeaders.Add("DataServiceVersion", "3.0;NetFx");  
     
               if (Client.DefaultRequestHeaders.Contains("MaxDataServiceVersion"))  
                   Client.DefaultRequestHeaders.Remove("MaxDataServiceVersion");  
               Client.DefaultRequestHeaders.Add("MaxDataServiceVersion", "3.0;NetFx");  
     
               if (Client.DefaultRequestHeaders.Contains("If-Match"))  
                   Client.DefaultRequestHeaders.Remove("If-Match");  
               Client.DefaultRequestHeaders.Add("If-Match", "*");  
     
               if (Client.DefaultRequestHeaders.Contains("Authorization"))  
                   Client.DefaultRequestHeaders.Remove("Authorization");  
               var sas = getAuthTokenPut(Client, storageAccount, accessKey, resource, department, id);  
               Client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", sas);  
     
               return Client;  
           }  
           public string getAuthTokenPut(HttpClient request, string storageAccount, string accessKey, string resource, string department, string id)  
           {  
               try  
               {  
                   string sAuthTokn = "";  
     
                   string stringToSign = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture) + "\n";  
     
                   stringToSign += "/" + storageAccount + "/" + resource + "(PartitionKey='" + department + "',RowKey='" + id + "')";  
     
                   HMACSHA256 hasher = new HMACSHA256(Convert.FromBase64String(accessKey));  
     
                   sAuthTokn = "SharedKeyLite " + storageAccount + ":" + Convert.ToBase64String(hasher.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));  
     
                   return sAuthTokn;  
               }  
               catch (Exception ex)  
               {  
                   throw ex;  
               }  
           }  
Azure Table Storage
Azure Table Storage
An Azure service that stores structured NoSQL data in the cloud.
156 questions
ASP.NET Core
ASP.NET Core
A set of technologies in the .NET Framework for building web applications and XML web services.
4,134 questions
C#
C#
An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
10,197 questions
{count} votes