Статьи

Включение междоменного доступа к BLOB-объектам Windows Azure с клиентов Flash

Вот интересный кусок, который недавно наткнулся на мой стол. Если вы создаете приложения с помощью Adobe Flash и хотите включить использование Windows Azure для хранения больших двоичных объектов, вам необходимо создать «файл междоменной политики», чтобы клиент Flash мог запрашивать большие двоичные объекты.

Зачем? Потому что этого требует Flash-клиент. В частности:

«Из соображений безопасности фильм Macromedia Flash, воспроизводимый в веб-браузере, не имеет доступа к данным, которые находятся за пределами того веб-домена, из которого был создан SWF». — Источник: междоменная политика для Flash-фильмов

Так как это связано с использованием хранилища BLOB-объектов Windows Azure из приложений Flash?

Ну, представь это. Вы создаете приложение Flash и размещаете его на своем сайте. Это может быть даже сайт, размещенный в Windows Azure, а может и нет. В любом случае, само приложение имеет «точный веб-домен, из которого был создан SWF», а именно:

Хостинг Платформа Типичный URL Исходный домен (как видно из Flash)
Не Windows Azure Host http://www.mycompany.com mycompany.com
Облачные службы Windows Azure, нет пользовательских CNAME http://mycompany.cloudapp.net mycompany.cloudapp.net
Облачные службы Windows Azure с пользовательским CNAME http://www.mycompany.com mycompany.com
Сайты Windows Azure http://mycompany.azurewebsites.net mycompany.azurewebsites.net
Сайты Windows Azure, общий или зарезервированный режим, с настраиваемым доменным именем http://www.mycompany.com mycompany.com

Теперь возникает проблема. Когда вы обращаетесь к хранилищу BLOB-объектов Windows Azure, домен, который будет обслуживать ваши большие двоичные объекты, станет поддоменом http://blob.core.windows.net (что-то вроде http://yourcompany.blob.core.windows .сеть), и это не совпадает с _any_ из этих доменов здесь. По умолчанию Flash не разрешает вам доступ к этому домену, если вы не можете обслуживать файл crossdomain.xml из этого домена. Этот файл политики представляет собой небольшой XML-файл, который дает Flash Player разрешение на доступ к данным из данного домена без отображения диалогового окна безопасности. Когда он находится на сервере, он позволяет Flash Player иметь прямой доступ к данным на сервере без запроса доступа пользователя. Но поскольку Windows Azure Blob Storage является службой Azure, это невозможно, верно?

Как оказалось … это возможно. Фактически вы можете разместить файл crossdomain.xml в корневом контейнере хранилища больших двоичных объектов, а затем просто убедиться, что корневой контейнер имеет открытый доступ для чтения. Это выглядит следующим образом:

CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("$root");
cloudBlobContainer.CreateIfNotExist();
cloudBlobContainer.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });