2008-12-27 23 views
25

He escrito un servicio WCF muy simple que envía y recibe mensajes. He probado la aplicación a través del host del servidor web predeterminado de VS 2008 y todo funciona bien. Pero cuando despliego el servicio WCF al IIS de otra computadora, recibo el siguiente error:WCF: La solicitud de token de seguridad no se pudo cumplir porque la autenticación falló

"No se pudo satisfacer la solicitud del token de seguridad porque la autenticación falló".

¿Cómo puedo establecer el tipo de autenticación para usar mi nombre de usuario y contraseña personalizados en el archivo de configuración? Si no es posible, dígame cómo puedo configurar sus credenciales de Windows porque las 2 computadoras que estoy usando no comparten los mismos usuarios.

Respuesta

32

Debe desactivar la seguridad del enlace. De lo contrario, creo que, de forma predeterminada, wsHttpBinding intentará negociar un Token de contexto de seguridad (SCT).

Por lo tanto, modifique la definición del punto final para que apunte a una sección de configuración de enlace. He aquí un ejemplo:

<endpoint address="" 
      binding="wsHttpBinding" 
      contract="HelloWorldService.IService1" 
      bindingConfiguration="TheBindingConfig"> 

y luego añadir algo como lo siguiente configuración de enlace inmediatamente después de la sección de <services> en la sección del web.config <system.serviceModel>.

<bindings> 
    <wsHttpBinding> 
    <binding name="TheBindingConfig"> 
     <security mode="None" /> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Configurando la seguridad a "Ninguno" es la clave.

Espero que esto sirvió!


Lo anterior me ayudó - pero lo que no es inmediatamente obvio es cómo añadir a la servicio final (su clara una vez que lo ha hecho lo que se necesita, pero no hasta que lo haya hecho). La razón por la que no es completamente obvio es porque no hay una sección de enlaces por defecto, mientras que es probable que haya una en el cliente.

Por lo tanto, para ser muy claros, al final del servicio, agregue la sección de enlaces (como se detalla anteriormente) y luego al punto final apropiado agregue el atributo bindingConfiguration = "TheBindingConfig". Obvia una vez que haya hecho una vez ...

+4

Creo que es una mala respuesta para automiticaly ir con la desactivación de la seguridad – TruthOf42

12

Asegúrese de ajustar este bindingConfiguration (especificando el modo de seguridad 'ninguno') en tanto cliente y el servidor o de lo contrario obtendrá este mensaje - lo cual es una cortina de humo en cuanto a la depuración del problema.

The message could not be processed. This is most likely because the action ' http://tempuri.org/IInterfaceName/OperationName ' is incorrect or because the message contains an invalid or expired security context token or because there is a mismatch between bindings. The security context token would be invalid if the service aborted the channel due to inactivity. To prevent the service from aborting idle sessions prematurely increase the Receive timeout on the service endpoint's binding.

20

En realidad, no necesita desactivar la seguridad y en algunos casos no debe hacerlo. Dentro de un bindingConfiguration, puede especificar la seguridad a nivel de mensaje que no establezca un contexto de seguridad de la siguiente manera:

<security mode="Message"> 
    <transport clientCredentialType="Windows" proxyCredentialType="None" 
         realm="" /> 
    <message clientCredentialType="Windows" negotiateServiceCredential="true" 
     algorithmSuite="Default" establishSecurityContext="false" /> 
</security> 

Nota atributo EstablishSecurityContext. Tanto el cliente como el servicio deben tener una configuración de seguridad con establecerSeguridadContexto establecido en el mismo valor. Un valor de verdadero también funciona bien, pero se recomienda falso en un entorno donde los servidores están equilibrados de carga.

+0

+1 ¡Es una primera publicación ingeniosa señor! –

0

Si se encuentra en modo de depuración continuación, establezca el atributo de depuración como

<serviceDebug includeExceptionDetailInFaults="true"/> 

por defecto se establece como falso .so, mientras que ir para depurar arroja que la excepción.

Espero que ayude.

Cuestiones relacionadas