Exporter (0) Imprimer
Développer tout

Prise en charge Silverlight et Flash

Mis à jour: juin 2014

Le kit de développement logiciel comprend la prise en charge des scénarios entre domaines pour les clients Silverlight et Flash.

Les navigateurs et les langages de programmation côté client, comme Javascript, respectent une stratégie de sécurité appelée la stratégie same origin. Cette stratégie restreint les appels entre domaines, c'est-à-dire qu'elle autorise uniquement l'exécution de code dans le navigateur pour appeler un code qui réside sur le site de l'hôte à partir duquel le code du navigateur a été téléchargé. Cette stratégie n'autorise pas l'exécution du code dans un navigateur pour appeler un code résidant sur un autre site (le site cible).

Vous pouvez configurer explicitement l'accès entre domaines si le site cible place un fichier de stratégie spécifique à sa racine. Pour Silverlight, ce fichier de stratégie s'intitule ClientAccessPolicy.xml. Pour Flash, le fichier de stratégie entre domaines s'appelle CrossDomain.xml. Voici un exemple de simple fichier ClientAccessPolicy.xml :

<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers="*" http-methods="*">
                <domain uri="https://*"/>
                <domain uri="http://*"/>
            </allow-from> 
            <grant-to> 
                <resource path="/" include-subpaths="true" />
            </grant-to> 
        </policy>
    </cross-domain-access>
</access-policy>

Pour le service Access Control, l'accès entre domaines est configuré par défaut sur tous les espace de noms de service. Pour Service Bus, vous devez configurer explicitement l'accès entre domaines. Pour activer les téléchargements du fichier de stratégie à la racine de l'espace de noms de service, Service Bus fournit les commandes REST (PUT, DELETE) qui permettent cette opération. Par exemple :

static HttpStatusCode PublishClientAccessPolicy(string serviceNamespace, string authHeaderValue, byte[] fileContentArray)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("https://{0}.{1}/clientaccesspolicy.xml", serviceNamespace, ServiceBusUriPostFix));

    request.Method = "PUT";
    request.ContentType = "text/xml";

    request.ContentLength = fileContentArray.Length;
    request.Headers[AuthorizationHeader] = authHeaderValue;

    Stream dataStream = request.GetRequestStream();
    dataStream.Write(fileContentArray, 0, fileContentArray.Length);
    dataStream.Close();

    return SendHttpRequestAndGetResponse(request);
}

De même, le code suivant supprime le fichier de stratégie :

static HttpStatusCode DeleteClientAccessPolicy(string serviceNamespace, string authHeaderValue)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("https://{0}.{1}/clientaccesspolicy.xml", serviceNamespace, ServiceBusUriPostFix));

    request.Method = "DELETE";
    request.Headers[AuthorizationHeader] = authHeaderValue;
    return SendHttpRequestAndGetResponse(request);
}

Pour adresser par programme des points de terminaison sécurisés, Service Bus requiert un jeton Access Control avec l'envoi d'une revendication Manage par un en-tête HTTP Authorization. Étant donné que Silverlight n'autorise pas les applications à écrire directement dans l'en-tête HTTP Authorization, l'API des services Service Bus prend en charge l'en-tête personnalisé HTTP X-MS-Authorization, qui se comporte de la même façon que l'en-tête HTTP Authorization. L'exemple suivant illustre l'utilisation de cet en-tête personnalisé.

const string XMSAuthorizationHeader = "X-MS-Authorization";

public void CreateMessageBuffer(UploadStringCompletedEventHandler createMessageBufferCompleted)
        {
            string bufferLocation = AddTrailingSlashIfNeeded(this.messageBufferLocation);

            WebClient webClient = new WebClient();
            webClient.BaseAddress = bufferLocation;
            webClient.Headers[XMSAuthorizationHeader] = this.authHeaderValue;
            webClient.Headers[HttpRequestHeader.ContentType] = "application/atom+xml;type=entry;charset=utf-8";
            webClient.UploadStringCompleted += createMessageBufferCompleted;

            this.AppendOutputText("MessageBuffer.Create: Sending request to create message buffer");
            webClient.UploadStringAsync(new Uri(bufferLocation), "PUT", DefaultPolicy, "MessageBuffer.Create");
        }

Afficher:
© 2015 Microsoft