Связывание JSONP WCF и httpsTransport - PullRequest
13 голосов
/ 17 сентября 2009

Мой вопрос вращается вокруг службы WCF REST для IIS, которая отвечает JSONP. Я взял уроки в этом решении: http://msdn.microsoft.com/en-us/library/cc716898.aspx и добавил их к своим. На моей рабочей станции разработчика все работало нормально, используя олицетворение с httpTransport, но когда я попытался перейти на сервер разработки, я столкнулся с некоторыми проблемами безопасности. Эти проблемы были решены с помощью приведенной ниже конфигурации и идентификатора пользователя пула приложений. Я также настраиваю файл метабазы ​​IIS для проверки подлинности только NTLM (мы используем IIS 6, но скоро это будет IIS 7, нужно будет работать с обоими), так как у меня нет доступа для создания SPN. Я считаю, что текущая конфигурация решила мои проблемы с безопасностью , но в процессе мой ответ JSONP был понижен до обычного JSON , это проблема. Вот соответствующая конфигурация:

    <services>
        <service name="IS.Core.Infrastructure.RESTRouter.Transactions" behaviorConfiguration="">
            <endpoint address="" behaviorConfiguration="webHttp" binding="customBinding"
              bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.ITransactions">
            </endpoint>
        </service>

        <service name="IS.Core.Infrastructure.RESTRouter.Queue" behaviorConfiguration="">
            <endpoint address="" behaviorConfiguration="webHttp"  binding="customBinding"
                bindingConfiguration="jsonpBinding" contract="IS.Core.Infrastructure.RESTRouter.IQueue" />
        </service>
    </services>

    <behaviors>
        <endpointBehaviors>
            <behavior name="webHttp">
                <webHttp />
            </behavior>
        </endpointBehaviors>
    </behaviors>

    <bindings>
        <customBinding>
            <binding name="jsonpBinding">
                <jsonpMessageEncoding />
                <httpsTransport
                      manualAddressing="true"
                      authenticationScheme="Ntlm" />
            </binding>
        </customBinding>
    </bindings>

    <extensions>
        <bindingElementExtensions>
            <add name="jsonpMessageEncoding"
              type="IS.Core.Infrastructure.RESTRouter.JsonpBindingExtension, RESTRouter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </bindingElementExtensions>
    </extensions>

Вот одно из определений метода интерфейса:

    [OperationContract]
    [WebGet(UriTemplate = "{ModelPath}/{ObjectTypeName}?callback={callback}", ResponseFormat = WebMessageFormat.Json)]
    [JSONPBehavior(callback = "callback")]
    JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback);

Вот его реализация:

    [OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
    public JSONPXml NewObject(string ModelPath, string ObjectTypeName, string callback) {

        int val = getEmployeeIdByNTUsername(OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name);

        JSONPXml jsp = null;
        EntityPluginReflectorClient client = null;
        try {
            client = new EntityPluginReflectorClient();
            string output = client.NewObject(ModelPath, ObjectTypeName);
            jsp = new JSONPXml() { xml = output };
        } catch (Exception e) {
            InfrastructureLog.WriteException(this, "NewObject", e);
            jsp = getExceptionResponse(e);
        }
        finally {
            client.Close();
        }
        return (jsp);
    }

и вот контракт данных:

[DataContract()]
public class JSONPXml {
    public JSONPXml() { }
    [DataMember]
    public string xml;
}

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и спасибо за просмотр.

Ответы [ 2 ]

1 голос
/ 21 мая 2010

Я не уверен на 100% в ответе, но вот несколько вещей, которые помогут вам сузить его:

Для начала, если для ProtectionLevel явно задано либо Sign, либо EncryptAndSign, то необходимо использовать привязку с включенной защитой, иначе будет сгенерировано исключение. Это приведет к возникновению исключений, если вы попытаетесь получить к нему доступ через http, что поможет вам выяснить, как вы на самом деле получаете доступ к службе.

Во-вторых, поскольку вы используете настраиваемую привязку, вам нужно указать ей, какой тип защиты вы хотите в привязке. Я не думаю, что достаточно просто указать httpsTransport. Это можно сделать с помощью тега безопасности . По звуку вам нужно будет установить authenticationMode="SspiNegotiated".

В соответствии с пользовательскими документами для переплета

Порядок, в котором элементы появляются в стек имеет значение, потому что это порядок, в котором применяются операции на сообщение. Рекомендуемый заказ элементов стека выглядит следующим образом:

Транзакции (необязательно)

Надежный обмен сообщениями (необязательно)

Безопасность (необязательно)

Транспорт

Кодер (опционально)

Больше информации о Custom Binding Security здесь и здесь Надеюсь, это поможет.

0 голосов
/ 20 сентября 2009

Это может показаться очевидным, но вы проверили, что вы все еще передаете параметр запроса "обратного вызова" на своем сервере разработки?

Глядя на источник JSONPEncoder, кажется, что он все равно запишет в ответ сообщение JSON, даже если параметр "обратного вызова" не был получен. Он просто не отформатирует оболочку метода JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...