Azure Storage Queue - Randomly Getting 403 Forbidden on delete of queue message with REST API

 

While developing an application that reads and deletes messages on an Azure storage Queue using the REST API (not the Azure Storage libraries), some requests (but not all) to delete a message are returned by a 403 error and the message is not deleted. This does not happen all the time. In many cases it works fine but it seems to randomly fail for a few requests.

The remote server returned an error: (403) Forbidden.AuthenticationFailed. Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. The MAC signature found in the HTTP request 'ALWhzP+84PAKpkQLpDj8Sl4MtnGkla3P0WjLkRaPDl4=' is not the same as any computed signature.

So I took a fiddler to log the request and response.

This delete worked!

GETTING THE  MESSAGE  FROM  THE  QUEUE

Request

 GET https://annayakstorage.queue.core.windows.net/restapiqueuecefbcdda-aadc-4676-9800-b96022ed78f6/messages HTTP/1.1
 x-ms-date: Mon, 23 Feb 2015 16:24:59 GMT
 x-ms-version: 2009-09-19
 Authorization: SharedKey annayakstorage:gPlR4ol9dgBPfW9B/KQ9jKdSLZP8lakXKGQL73/xNQf=
 Accept: application/atom+xml,application/xml
 Host: annayakstorage.queue.core.windows.net

Response

 HTTP/1.1 200 OK
 Cache-Control: no-cache
 Transfer-Encoding: chunked
 Content-Type: application/xml
 Server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
 x-ms-request-id: gp9a9lfq-0007-0056-9k3q-9003l8000000
 x-ms-version: 2009-09-19
 Date: Mon, 23 Feb 2015 16:25:01 GMT
  
 <?xml version="1.0" encoding="utf-8"?>
 <QueueMessagesList>
 <QueueMessage>
 <MessageId>4g8ap7be-573k-6o9d-97ct-4k73k935gldk </MessageId>
 <InsertionTime>Mon, 25 Feb 2015 16:24:59 GMT</InsertionTime>
 <ExpirationTime>Mon, 04 Mar 2015 16:24:59 GMT</ExpirationTime>
 <DequeueCount>1</DequeueCount>
 <PopReceipt> AgAAAAMAAAAAAAAAFFKoV9QS0KF=</PopReceipt>
 <TimeNextVisible>Mon, 25 Feb 2015 16:25:31 GMT</TimeNextVisible>
 <MessageText> PQPxl9KmQLFaplGzSPQldxUaEL9lqPztDIF=</MessageText>
 </QueueMessage>
 </QueueMessagesList>

DELETING THE  MESSAGE  FROM  THE  QUEUE

Request

 DELETE https://annayakstorage.queue.core.windows.net/restapiqueuecefbcdda-aadc-4676-9800-b96022ed78f6/messages/8e3be9ab-759b-4e0c-88bc-9c67d524bcad?popreceipt=AgAAAAMAAAAAAAAAFFKoV9QS0KF=HTTP/1.1  
 x-ms-date: Mon, 25 Feb 2015 16:24:59 GMT
 x-ms-version: 2009-09-19
 Authorization: SharedKey annayakstorage:zelCPqaDnaqGqXi1Eq8+5wpgAPZ0l73xuoC9D3C4k2c=
 Host: annayakstorage.queue.core.windows.net

Response

 HTTP/1.1 204 No Content
 Content-Length: 0
 Server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
 x-ms-request-id: gp9a8psq-0007-0056-8l6k-9003l8000000
 x-ms-version: 2009-09-19
 Date: Mon, 23 Feb 2015 16:25:01 GMT 

 

This Delete Failed!

GETTING THE  MESSAGE  FROM  THE  QUEUE

Request

 GET https://annayakstorage.queue.core.windows.net/restapiqueuecefbcdda-aadc-4676-9800-b96022ed78f6/messages HTTP/1.1 
 x-ms-date: Mon, 25 Feb 2015 16:24:59 GMT
 x-ms-version: 2009-09-19
 Authorization: SharedKey annayakstorage:gPlR4ol9dgBPfW9B/KQ9jKdSLZP8lakXKGQL73/xNQf=
 Accept: application/atom+xml,application/xml
 Host: annayakstorage.queue.core.windows.net

Response

 HTTP/1.1 200 OK
 Cache-Control: no-cache
 Transfer-Encoding: chunked
 Content-Type: application/xml
 Server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
 x-ms-request-id: ge9sk924-0005-0078-843u-8114k9000000
 x-ms-version: 2009-09-19
 Date: Mon, 25 Feb 2015 16:25:01 GMT
  
 <?xml version="1.0" encoding="utf-8"?>
 <QueueMessagesList>
 <QueueMessage>
 <MessageId>8dvk9450-g8dk-6932-4j83-3429rslw8l2a</MessageId>
 <InsertionTime>Mon, 25 Feb 2015 16:24:59 GMT</InsertionTime>
 <ExpirationTime>Mon, 04 Mar 2015 16:24:59 GMT</ExpirationTime>
 <DequeueCount>1</DequeueCount>
 <PopReceipt>AgAAAAMAAAAAAAAADQ+uV9QS0KF=</PopReceipt>
 <TimeNextVisible>Mon, 23 Feb 2015 16:25:31 GMT</TimeNextVisible>
 <MessageText>YULzc2PaPAPbpwTkQgLsyxEmDL4laWaLWdP=</MessageText>
 </QueueMessage>
 </QueueMessagesList>
  

DELETING THE  MESSAGE  FROM  THE  QUEUE

Request

 DELETE https://annayakstorage.queue.core.windows.net/plccommandsqueuecefbcdda-aadc-4676-9800-b96022ed78f6/messages/9cdb1031-b4fb-4079-8e59-4323efcd3e4c?popreceipt=AgAAAAMAAAAAAAAADQ+uV9QS0KF=HTTP/1.1 
 x-ms-date: Mon, 25 Feb 2015 16:24:59 GMT
 x-ms-version: 2009-09-19
 Authorization: SharedKey annayakstorage:QKWlaP+39WLQalWPaKd7Ka9MwpAjbh9Q9GaDlPxAFl9=
 Host: annayakstorage.queue.core.windows.net

Response

 HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
 Content-Length: 783
 Content-Type: application/xml
 Server: Microsoft-HTTPAPI/2.0
 x-ms-request-id: ge9sk924-0005-0093-843u-8114k9000000
 Date: Mon, 25 Feb 2015 16:25:01 GMT

Error

 <?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
 RequestId: ge9sk924-0005-0093-843u-8114k9000000
  
 Time:2015-02-25T16:25:01.8486841Z</Message><AuthenticationErrorDetail>The MAC signature found in the HTTP request ‘QKWlaP+39WLQalWPaKd7Ka9MwpAjbh9Q9GaDlPxAFl9=’ is not the same as any computed signature. Server used following string to sign: 
 'DELETE 
 x-ms-date:Mon, 25 Feb 2015 16:24:59 GMT
 x-ms-version:2009-09-19
 /annayakstorage/restapiqueuecefbcdda-aadc-4676-9800-b96022ed78f6/messages/9cdb1031-b4fb-4079-8e59-4323efcd3e4c
 popreceipt:AgAAAAMAAAAAAAAAFF wV4VP0AE='.</AuthenticationErrorDetail></Error>

After spending quite some hours through the traces I noticed that in the failing case the popreceipt is not the same as the one inside the message and hence it gives the error. 

Popreceipt in the request - DELETE https://annayakstorage.queue.core.windows.net/plccommandsqueuecefbcdda-aadc-4676-9800-b96022ed78f6/messages/9cdb1031-b4fb-4079-8e59-4323efcd3e4c?popreceipt= AgAAAAMAAAAAAAAADQ+uV9QS0KF= HTTP/1.1

Popreceipt in the error response – popreceipt : AgAAAAMAAAAAAAAADQ uV9QS0KF=

If you notice the ’+’ is gone. In all the working cases I see the popreceipt didn't have a ’+’. So whenever the message has a popreceipt with a + as below it was failing.

<?xml version="1.0" encoding="utf-8"?>

<QueueMessagesList>

<QueueMessage>

<MessageId>8dvk9450-g8dk-6932-4j83-3429rslw8l2a</MessageId>

<InsertionTime>Mon, 25 Feb 2015 16:24:59 GMT</InsertionTime>

<ExpirationTime>Mon, 04 Mar 2015 16:24:59 GMT</ExpirationTime>

<DequeueCount>1</DequeueCount>

<PopReceipt>AgAAAAMAAAAAAAAADQ + uV9QS0KF=</PopReceipt>

<TimeNextVisible>Mon, 25 Feb 2015 16:25:31 GMT</TimeNextVisible>

<MessageText>YULzc2PaPAPbpwTkQgLsyxEmDL4laWaLWdP=</MessageText>

</QueueMessage>

</QueueMessagesList>

As per the standard reserved characters need to be URL encoded when transmitted over the internet. https://en.wikipedia.org/wiki/Percent-encoding

So I used the .Net class WebUtility (https://msdn.microsoft.com/en-us/library/zttxte6w(v=vs.110).aspx) and URL encoded the parameters like popreceipt.

The following changes were made to the code to encode the special character. 

 String urlPath = String.Format("{0}/messages/{1}?popreceipt={2}", 
 WebUtility.UrlEncode(queueName), WebUtility.UrlEncode(messageid),
 WebUtility.UrlEncode(popreceipt));

It started working fine after that and the deletes don’t fail randomly anymore.

Regards,

Angshuman Nayak

Cloud Integration Engineer