Междоменный вопрос службы Silverlight WCF

У меня есть приложение silverlight (размещенное на intranet.mydomain.net) и служба WCF на (webservices.mydomain.net)

Нужен ли мне файл межсайтовой политики? Если да, то как будет выглядеть разрешение доступа только с intranet.mydomain.net?


person Nate    schedule 01.09.2009    source источник


Ответы (2)


Да, вам понадобится файл clientaccesspolicy.xml в ROOT домена вашей службы (webservices.mydomain.net).

По умолчанию Silverlight поддерживает вызовы веб-служб в том же домене или исходном сайте. Один и тот же домен означает, что вызовы должны использовать один и тот же поддомен, протокол и порт. Это сделано из соображений безопасности и предотвращает междоменную подделку.

Вот пример файла:

<?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>

Это разрешит запросы только от intranet.mydomain.net.

Изменить

Был задан вопрос: как это будет работать, если у меня есть две службы WCF? /ServiceA/a.svc и /ServiceB/b.svc, и я хочу, чтобы ServiceA была открыта для всех и в любом месте, а ServiceB работала только из моей интрасети?

Ваш файл политики будет выглядеть так:

<?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>
person DaveB    schedule 07.12.2009
comment
Как это будет работать, если у меня две службы WCF? /ServiceA/a.svc и /ServiceB/b.svc и я хочу, чтобы ServiceA была открыта для всех и в любом месте, а ServiceB работала только из моей интрасети? Возможно ли это из кроссдоменного файла? - person Nate; 07.12.2009
comment
Будет ли это работать в Safari? Похоже, что Safari по умолчанию не поддерживает кроссдоменные xml-файлы. Конечно, это может не иметь значения ... - person Gyuri; 07.12.2009
comment
Одно это не помешает кому-либо использовать службу, но гарантирует, что ни один из клиентов Silverlight не будет ее использовать. Потребуются другие средства блокировки, чтобы предотвратить полный доступ. - person Nate; 08.12.2009

Возможно, вы захотите проверить следующую ссылку о 'Как использовать файлы междоменной политики с Silverlight', автор: Тим Хойер.

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

Вот еще одна страница из блога Тима Хойера, которую вы можете прочитать, также есть примеры:

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

alt text

Я бы подумал о написании вашей собственной службы WCF, которая живет с вашим приложением silverlight и обрабатывает запросы к вашей внешней службе WCF. Таким образом, вы ничего не оставляете открытым, и разрешается только связь с вашей контролируемой службой (хотя служба, которую вы упомянули, может находиться под вашим контролем).

Этот метод также полезен, когда другая служба находится вне ваших рук и может часто меняться. Вы можете контролировать, как это обрабатывается, через свой собственный сервис, и вам никогда не придется обновлять элемент управления silverlight (при условии, что изменения не являются радикальными).

person Kelsey    schedule 07.12.2009