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