2009-09-01 9 views
5

J'ai une application silverlight (hébergé à intranet.mydomain.net) et un service de WCF à (webservices.mydomain.net)service WCF Cross Domain Question

Ai-je besoin d'un fichier de stratégie cross-site? Si oui, à quoi cela ressemblerait-il de n'autoriser l'accès qu'à partir de intranet.mydomain.net?

Répondre

4

Oui, vous aurez besoin d'un fichier clientaccesspolicy.xml dans la ROOT de votre domaine de service (webservices.mydomain.net). Par défaut, Silverlight prend en charge les appels aux services Web sur le même domaine ou le même site d'origine. Le même domaine signifie que les appels doivent utiliser le même sous-domaine, protocole et port. C'est pour des raisons de sécurité et empêche la falsification interdomaines.

Voici un exemple de fichier:

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

Cela permettrait à des demandes que de intranet.mydomain.net.

Modifier

Il a été demandé: Comment cela fonctionnerait si j'ai deux services WCF? /ServiceA/a.svc et /ServiceB/b.svc et je veux que ServiceA soit ouvert à n'importe qui, n'importe où, et que ServiceB fonctionne uniquement à partir de mon intranet?

Votre fichier de stratégie ressemblerait à ceci:

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

    <policy> 
     <allow-from http-request-headers="*"> 
     <domain uri="http://intranet.mydomain.net"/> 
     </allow-from> 
     <grant-to> 
     <resource path="/ServiceB/" include-subpaths="true"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 
+0

Comment cela fonctionnerait si j'ai deux services WCF? '/ ServiceA/a.svc' et'/ServiceB/b.svc' et je veux que ServiceA soit ouvert à n'importe qui, n'importe où, et que ServiceB fonctionne uniquement à partir de mon intranet? Est-ce possible à partir du fichier crossdomain? – Nate

+1

J'ai modifié ma réponse. – DaveB

+0

Cela fonctionnerait-il sur Safari? Il semble que Safari ne supporte pas les xml-s inter-domaines par défaut. Bien sûr, ça n'a pas d'importance ... – Gyuri

5

Vous pouvez consulter le lien suivant à propos « Comment utiliser des fichiers Cross Stratégie de domaine avec Silverlight » par Tim Heuer.

http://silverlight.net/learn/videos/all/how-to-use-cross-domain-policy-files-with-silverlight/

Voici une autre page du blog de Tim Heuer que vous pouvez lire qui a des exemples aussi bien:

http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx

alt text

je considère écrire votre propre service WCF qui vit avec votre application Silverlight et gère la demande à votre service WCF externe. De cette façon, vous ne laissez rien ouvert et seule la communication avec votre service contrôlé est autorisée (bien que le service que vous avez mentionné puisse être sous votre contrôle).

Cette méthode est également utile lorsque l'autre service est hors de votre contrôle et peut changer fréquemment. Vous pouvez contrôler comment cela est géré via votre propre service et ne jamais avoir besoin de mettre à jour votre contrôle Silverlight (en supposant que les changements ne sont pas drastiques).