microsoft - Firma de acceso compartido de Azure: la firma no coincide
login azure management portal (1)
Respuesta corta:
Agregue comp=list&restype=container
a su URL SAS y no debería obtener este error.
Respuesta larga:
Básicamente desde su URL SAS, Azure Storage Service no puede identificar si el recurso al que está intentando acceder es un blob o un contenedor y asume que es un blob. Dado que supone que el tipo de recurso es blob, utiliza el contenedor $root
blob blob para el cálculo SAS (que se puede ver en el mensaje de error). Dado que SAS se calculó para el contenedor de mark
manchas, se obtiene este error de Signature Does Not Match
. Al especificar restype=container
le está diciendo al servicio de almacenamiento que trate el recurso como container
. comp=list
es obligatorio según la especificación REST API.
Me aparece este error:
<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:6c3fc9a8-cdf6-4874-a141-10282b709022 Time:2014-07-30T10:48:43.8634735Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was rwl 2014-07-31T04:48:20Z /acoustie/$root 2014-02-14
</AuthenticationErrorDetail>
</Error>
Lo obtengo cuando genero un sas (Firma de acceso compartido) y luego pego ese sas al final del contenedor uri en un navegador. Esta es la dirección completa con los sas generados:
https://acoustie.blob.core.windows.net/mark?sv=2014-02-14&sr=c&sig=E6w%2B3B8bAXK8Lhvvr62exec5blSxsA62aSWAg7rmX4g%3D&se=2014-07-30T13%3A30%3A14Z&sp=rwl
He revisado SO y Google y he probado muchas combinaciones, hasta donde puedo decir que estoy haciendo todo correctamente, sé que no, no puedo verlo ... realmente espero que alguien me pueda ayudar: /
Para que quede claro, estoy generando un sas en un contenedor, no un blob específico y no en el contenedor raíz. El acceso en el blob se define como Blob público. Mi objetivo final es simplemente permitir escrituras en el contenedor con el sas, mientras que "depurar" he agregado la mayoría de los permisos a SharedAccessBlobPolicy.
He intentado agregar un / al principio y al final del nombre del contenedor. Ningún cambio.
Este es el código que uso para generar el sas:
var blobClient = storageAccount.CreateCloudBlobClient();
//Get a reference to the blob container
var container = blobClient.GetContainerReference(containerName);
// Do not set start time so the sas becomes valid immediately.
var sasConstraints = new SharedAccessBlobPolicy
{
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(30),
Permissions = SharedAccessBlobPermissions.Write
| SharedAccessBlobPermissions.Read
| SharedAccessBlobPermissions.List,
};
var sasContainerToken = container.GetSharedAccessSignature(sasConstraints);
//Return the URI string for the container, including the SAS token.
var sas = string.Format("{0}{1}", container.Uri.AbsoluteUri, sasContainerToken);
Logger.Debug("SAS: {0}", sas);
return sas;
Genera una firma, simplemente no parece ser una firma válida.
He probado diferentes contenedores, cambiando la política de acceso, con y sin tiempos de inicio, ampliando el vencimiento a> 12 horas a partir de ahora (estoy en una zona horaria UTC + 10), no parece importar lo que cambie da como resultado el mismo error de "firma no coincidente".
Incluso he intentado usar una versión anterior de ''WindowsAzure.Storage'', así que ahora he intentado con 4.2 y 4.1. Incluso probé el uri en un navegador diferente, realmente no debería marcar la diferencia, pero oye ...
Cualquier sugerencia es bienvenida :-)