2012-01-02 3 views
2

Я пытаюсь предоставить доступ только для чтения для своих капель с помощью веб-службы. У веб-службы есть метод, который принимает информацию о блоке и контейнере, а затем возвращает URL-адрес с общей подписью доступа, который пользователь может использовать для доступа к блобу. Поскольку эти изображения (капли) кэшируются на телефоне, я бы хотел, чтобы сигнатуры были действительны в течение 1 дня.SharedAccessSignature Azure

Я использую следующий код:

 var blobClient = GetBlobClient(); 
     var container = blobClient.GetContainerReference(containerName); 
     if (container != null) 
     { 
      container.CreateIfNotExist(); 
     } 

     var policy = new SharedAccessPolicy() 
     { 
      SharedAccessStartTime = DateTime.Now, 
      Permissions = SharedAccessPermissions.Read, 
      SharedAccessExpiryTime = DateTime.Now.AddDays(days) 
     }; 

     if (permissions.Contains("w")) 
     { 
      policy.Permissions = policy.Permissions | SharedAccessPermissions.Write; 
      policy.SharedAccessExpiryTime = DateTime.Now.AddMinutes(10); 
     } 

     //The shared access policy provides read/write access to the container for 10 hours. 
     BlobContainerPermissions containerPerms = new BlobContainerPermissions(); 
     // The public access setting explicitly specifies that the container is private, 
     // so that it can't be accessed anonymously. 
     containerPerms.PublicAccess = BlobContainerPublicAccessType.Off; 
     containerPerms.SharedAccessPolicies.Clear(); 
     containerPerms.SharedAccessPolicies.Add("mypolicy", policy); 
     // Set the permission policy on the container. 
     container.SetPermissions(containerPerms); 

     var blob = container.GetBlobReference(blobName); 
     // Get the shared access signature to share with users. 
     var blobPolicy = new SharedAccessPolicy(); 
     blobPolicy.SharedAccessExpiryTime = DateTime.Now.AddDays(days); 
     blobPolicy.Permissions = SharedAccessPermissions.Read; 
     string sas = blob.GetSharedAccessSignature(blobPolicy, "mypolicy"); 

     return sas; 

Каждый раз, когда я пытаюсь использовать этот код, я получаю следующее сообщение об ошибке: Подпись не соответствует. Строка знак используется был г 2012-01-03T08: 38: 52Z /myContainer/12100/12409/29cae1b6-2955-4a33-ab27-ff99f0bb6470_m.jpg MYPOLICY

Может кто-нибудь, пожалуйста, руководство меня с этим?

ответ

0

Возможно, это связано с тем, что подпись общего доступа не может быть более одного часа. Для того, чтобы иметь более чем один час SAS, необходимо использовать политику на уровне контейнера (который вы можете отменить) Выписка из article

One way that you can manage a Shared Access Signature is to control its lifetime by ensuring that it expires within an hour. If you want to continue to grant a client access to the blob after that time period, you must issue a new signature. This is the behavior of a Shared Access Signature that is not associated with a container-level access policy. A Shared Access Signature not bound to a container-level access policy cannot be revoked. If a start time is specified, the expiration time must be 60 or fewer minutes from the start time, or the signature is invalid and cannot be used. If no start time is specified, the signature is valid only during the 60 minute period before the expiration time. This policy is intended to minimize risk to a storage account in the event that the signature is leaked.

Another way to manage a Shared Access Signature is to associate the signature with a container-level access policy. The container-level access policy is represented by the signedidentifier field on the URL. A container-level access policy provides an additional measure of control over one or more Shared Access Signatures, including the ability to revoke the signature if needed.

1

Это выглядит как вы полностью настройки политики SAS для «MYPOLICY» на контейнер. Как только вы это сделаете, они не будут открыты для последующей модификации из параметров строки запроса. Это «заполняющая пробел» система. Единственными частями, которые вы можете указать в строке запроса, являются части, которые уже не указаны и сохранены в политике контейнера (т. Е. Заполнение пробелов). Таким образом, в этом случае, у вас есть

blobPolicy.SharedAccessExpiryTime = DateTime.Now.AddDays(days); 
blobPolicy.Permissions = SharedAccessPermissions.Read; 

Но, эти два варианта были уже сохраненными на политике, так что вы не можете определить их снова (они добавляют к полученной строке запросу). Если вы хотите указать их, вы не должны иметь их уже сохраненные на исходном SetPermission().

Вы можете подтвердить это, комментируя эти две строки, и ваша итоговая подпись должна быть действительной.

3

Я подозреваю, что проблема заключается в компоненте «подпись» вашего URL (параметр sig).

URL, чтобы получить доступ к BLOB должен быть в таком виде, если вы используете 60 минут URL без политики на нем:

http://[storage account name].blob.core.windows.net/[top level container name]/[filename of BLOB]?sr=b&st=2012-01-19T12:21:40Z&se=2012-01-19T13:21:40Z&sp=r&sig=[Base-64 encoded signature] 

Или в таком виде, если вы используете политику:

http://[storage account name].blob.core.windows.net/[top level container name]/[filename of BLOB]?sr=b&st=2012-01-19T12:21:40Z&se=2012-01-19T13:21:40Z&si=[name of security policy]&sig=[Base-64 encoded signature] 

О подписи (сиг параметр на URL:) Microsoft псевдокод показывает, как они хотят, чтобы создать подпись:

Signature=Base64(HMAC-SHA256(UTF8(StringToSign))) 

Как сделать строку для входа? См http://msdn.microsoft.com/en-us/library/windowsazure/ee395415.aspx

StringToSign = signedpermissions + "\n" + signedstart + "\n" + signedexpiry + "\n" + canonicalizedresource + "\n" + signedidentifier

В переводах строка имеют решающие значение - это эквивалентно шестигранные символы 0xA. Стандартные Java "\ n" переводы строк прекрасны. Не оставляйте их, иначе это не сработает.

Это нормально для того, чтобы подписанные передачи были пустыми - до тех пор, пока вы по-прежнему включаете перевод строки после подписанных сеансов, если это значение равно null.

Если списано сообщение заполнено, это нормально, если подписанный идентификатор имеет значение null. После этого вам не нужно ставить символ перевода строки.

Вы должны убедиться, что ваша строка преобразована в UTF-8 (Unicode 8), прежде чем запускать хэш HMAC SHA256 над ней.

См http://msdn.microsoft.com/en-us/library/windowsazure/hh508996.aspx

The string-to-sign is a unique string constructed from the fields that must be verified in order to authenticate the request. The signature is an HMAC computed over the string-to-sign and key by using the SHA256 algorithm, and then encoded by using Base64 encoding.

Смежные вопросы