2009-09-17 12 views
13

Mi pregunta gira en torno a un WCF REST Service para IIS que responde con JSONP. Tomé las clases en esta solución: http://msdn.microsoft.com/en-us/library/cc716898.aspx y las agregué a la mía. Las cosas funcionaban bien en mi estación de trabajo para desarrolladores usando suplantación con httpTransport, pero cuando traté de pasar al servidor de desarrollo me encontré con algunos problemas de seguridad. Estos problemas se resolvieron utilizando la configuración siguiente y un usuario de identidad del conjunto de aplicaciones. También estoy configurando el archivo de metabase de IIS para la autenticación NTLM solamente (estamos usando IIS 6 pero pronto será IIS 7, debe trabajar en ambos) ya que no tengo acceso para crear un SPN. Creo que la configuración actual resolvió mis problemas de seguridad pero en el proceso mi respuesta JSONP fue degradada a regualar JSON, este es el problema. Esta es la configuración correspondiente:WCF Custom JSONP Binding y httpsTransport

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

aquí es una de las definiciones de métodos de interfaz:

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

Aquí está su implementación:

[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); 
    } 

y aquí está el contrato de datos:

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

Por favor, avíseme si se necesita más información y gracias por investigar esto.

Respuesta

0

Esto puede parecer obvio, pero ¿ha comprobado que todavía está pasando el parámetro de consulta de "devolución de llamada" en su servidor de desarrollo?

Al mirar la fuente JSONPEncoder, parece que todavía se escribirá un mensaje JSON en la respuesta, incluso cuando no se haya recibido el parámetro "devolución de llamada". Simplemente no formateará el envoltorio del método JavaScript.

+0

Gracias, después de su comentario hice una doble comprobación y el parámetro de consulta de devolución de llamada está presente en ambos entornos. Una cosa a tener en cuenta es que en mi sistema local cuando cambio la configuración de httpTransport a HttpsTransport, la salida se convierte en json regular. –

+0

Extraño. Dijiste que incluías las clases de la muestra. Si coloca un punto de interrupción en ambos métodos WriteMessage de JSONPEncoderFactory, ¿alguno de ellos se golpea cuando realiza la llamada? –

1

No estoy 100% seguro de la respuesta, pero aquí hay algunas cosas que le ayudarán a limitar la búsqueda:

Para empezar, si se establece la ProtectionLevel explícitamente a cualquier signo o EncryptAndSign, entonces debe use un enlace con seguridad habilitada o se lanzará una excepción. Eso comenzará a arrojar excepciones si intenta acceder a través de http, lo que puede ayudarlo a descubrir cómo está realmente accediendo al servicio.

En segundo lugar, como está utilizando un enlace personalizado, deberá indicarle qué tipo de seguridad desea en el enlace. No creo que sea suficiente solo para especificar httpsTransport. La forma en que haces eso es a través del security tag. Por el sonido de esto, necesitarás establecer authenticationMode="SspiNegotiated".

Según the custom binding docs

El orden en que los elementos aparecen en los asuntos de la pila, debido a que es el orden en que se aplican las operaciones de al mensaje.El orden recomendado de elementos de la pila es el siguiente:

Transacciones (opcional)

Reliable Messaging (opcional)

Seguridad (opcional)

Transporte

Encoder (opcional)

Más información sobre Cu Seguridad de enlace de stom here y here Espero que eso ayude.