WCF: источники белого списка с использованием JSONP

Одним из недостатков политики одного и того же источника является то, что она не поддерживает разные порты или поддомены. В результате, если вы размещаете свои службы на поддомене, таком как services.site.com, вы не можете вызывать службу с www.site.com без использования JSONP.

Есть ли способ настроить службу WCF для приема запросов только из определенных источников?

Пример:

$(document).ready(function () {
    $("#Button").click(function () {
        $.getJSON("http://services.site.com/service.svc/myService?callback=?", function (data) {
            var jObj = $.parseJSON(data);
            $("#Result").html(jObj.MyValue);
        });
    });
});

Если бы это было вызвано с www.site.com, я бы хотел, чтобы это работало. Но если бы его назвал другой сайт, например www.example.com, я бы хотел, чтобы служба WCF заблокировала его.

Я попытался настроить файл web.config, чтобы он имел:

<identity>
  <dns value="www.example.com"/>
</identity>

Но когда я попытался позвонить с сайта www.site.com, он все равно работал нормально. Я считаю, что это связано с тем, что я установил для crossDomainScriptAccessEnabled значение true, чтобы JSONP возвращал правильное значение обратного вызова. Работаю с WCF всего несколько дней.

Заранее спасибо.


person Thomas B    schedule 07.05.2012    source источник


Ответы (1)


Идентификация используется для идентификации службы для клиента, поэтому она не поможет предотвратить вызов службы.

Если это бесплатная услуга, то аутентификация и авторизация клиента не требуется, независимо от того, откуда он исходит.

С другой стороны, если вы хотите защитить службу, вам необходимо аутентифицировать/авторизовать клиента в службу независимо от источника вызова. На эту тему много ресурсов:

MSDN Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) Примеры для .NET Framework 4

SO Защита служб WCF

Ресурсы безопасности MSDN WCF

Защита служб WCF: использование поставщиков членства и ролей ASP.NET

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

var messageProperty = OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;

После этого вы можете выполнить обратный поиск DNS, но это может не всегда работать (прокси, NAT и т. д.).

Еще один важный момент: использование GET для вызовов JSON может привести к перехвату JSON

person Petar Vučetin    schedule 08.05.2012