Aquí es la situación que estoy tratando de hacer frente a:Cómo redirigir un servicio WCF a un HTTPS punto final con credencial de Windows
Tenemos un cliente WCF que trabaja con un punto final de http y https punto final, pero no cuando se es redireccionado (302) de http a https. Tenemos un equilibrador de carga F5 que está ejecutando el redireccionamiento y la funcionalidad SSL, pero hasta donde puedo decir, no está haciendo nada inesperado para las solicitudes. El redireccionamiento parece ser el culpable de que WCF no desee proporcionar la información de autenticación Kerberos de Windows una vez que se realiza la redirección.
La secuencia para una llamada con éxito (es decir, http sin redirección) dice así:
- Client - envía solicitud POST para el servicio con el esquema http
- Servidor - responde con 401 no autorizado
- Client - Envia Negociar POST con autorización
- Servidor - Responde con 100 Continuar
- Cliente - Envía datos de jabón y completa con éxito
Cuando se redirige la llamada y no va así:
- Cliente - Envía solicitud POST para el servicio con el esquema http
- Servidor - Devuelve 302 con redirección a https esquema para la misma dirección
- Cliente - Envía GET dirección https (no puedo entender por qué esto es un GET y no un POST)
- servidor - Responde con 401 autorizado
- Cliente: lanza la excepción "La solicitud HTTP no está autorizada con el esquema de autenticación del cliente 'Negociar'. El encabezado de autenticación recibido del servidor fue 'Negotiate, NTLM'."
Es similar a this problem pero no exactamente el mismo (y en realidad no hay una respuesta no hace referencia a pesar de que 'romper el protocolo WCF' en el que puedo encontrar documentación). Si desactivamos la regla de redirección F5, el tráfico http y https funciona bien. ¿WCF realmente no maneja este simple redireccionamiento? ¿Hay alguna solución o documentación sobre este error?
Client config (tenga en cuenta que al probar esto con https, cambio TransportCredentialOnly a Transport):
<client>
<endpoint address="http://fooserver/MyService.svc/" binding="basicHttpBinding" bindingConfiguration="clientBinding" contract="Contracts.IMyService" />
</client>
<bindings>
<basicHttpBinding>
<binding name="clientBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
de configuración del servidor se ve así:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="securedBinding" contract="Contracts.IMyService">
</endpoint>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="securedBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<useRequestHeadersForMetadataAddress>
<defaultPorts>
<add scheme="http" port="80" />
<add scheme="https" port="443" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Posible duplicado de [¿Por qué WCF no podría llamar a un servicio SOAP cuando se encuentra una respuesta 302?] (Http://stackoverflow.com/questions/17152385/why-would-wcf-fail-to-call-a -soap-service-when-a-302-response-is-encounter) – Luizgrs