2009-01-09 30 views
8

No puedo averiguar cómo habilitar las instancias por sesión para mi servicio WCF mientras uso HTTPS. (No soy un experto en ASP.NET pero no quiero usar el estado de la sesión ASP.NET si es posible). Estoy usando .NET Framework 3.0.Sesiones WCF con HTTPS

He llegado a la siguiente contradicción y espero que alguien pueda decirme dónde hay un error en la lógica.

1) El servicio debe estar alojado en IIS 6 debido al mandato del cliente.

2) El servicio necesita mantener el estado entre las llamadas, incluidas las instancias SqlConnection y SqlTransaction (feas pero necesarias debido a las limitaciones del proyecto).

3) Por lo tanto, necesito usar el wsHttpBinding.

4) El servicio debe poder acceder a la información de autenticación de usuario desde HttpContext.Current.User.Identity (por ejemplo, utilizando la seguridad de Windows en IIS).

5) Por lo tanto, se requiere HTTPS.

6) La seguridad del nivel de transporte debe configurarse en el enlace.

7) Configurar el servicio para requerir sesiones significa que tengo que configurar wsHttpBinding para usar Reliable Sessions.

8) Esto requiere que la seguridad de nivel de mensaje esté configurada en el enlace.

I.e. (6) y (8) son mutuamente excluyentes.

Parece que el uso de sesiones de WCF requiere que use seguridad a nivel de mensajes, lo que me impide usar HTTPS.

¿Qué me estoy perdiendo?

+0

¿Está experimentando errores específicos con esta configuración o está revisando si esta configuración es factible? –

+0

Me gustaría saber si la configuración es posible: es decir, sesiones de WCF con HTTPS. Gracias. –

Respuesta

15

3) verdadera, wsHttpBinding y wsDualHttpBinding son los únicos enlaces HTTP que soportan sesiones

5) falsos, con el fin de autenticar a los llamadores de servicios que no necesariamente necesitas cualquier seguridad de nivel de transporte (como SSL/HTTPS). El único requisito es configurar IIS para habilitar Autenticación de Windows integrada para un directorio virtual. Luego, en WCF tiene tres posibilidades que permitan a este escenario:

a) Utilizar la seguridad de nivel de transporte en el wsHttpBinding con las credenciales de Windows (HTTPS)

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="SecurityEnabledWsHttp"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
</system.serviceModel> 

b) Utilizar la seguridad a nivel de mensajes en el wsHttpBinding con ventanas credenciales (HTTP)

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="SecurityEnabledWsHttp"> 
       <security mode="Message"> 
        <message clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
</system.serviceModel> 

c) Ejecutar el servicio bajo el ASP.NET Modo de compatibilidad y habilitar la autenticación de windows en ÁSPID.NET (HTTP)

<system.web> 
    <authentication mode="Windows" /> 
</system.web> 

Nótese que en un y b se accede a la identidad de la persona que llama desde dentro de un servicio de esta manera:

OperationContext.Current.ServiceSecurityContext.WindowsIdentity 

6) verdadera, transporte -nivel de seguridad debe estar habilitado en el wsHttpBinding para poder usar HTTPS

7) False, Sesiones confiables es una implementación particular de Mensajería confiable para sesiones de WCF. Reliable Messaging es una especificación estándar WS- * diseñada para garantizar la entrega de mensajes en una red no confiable. Puede usar sesiones de WCF sin Mensajería confiable, y viceversa. Las sesiones están habilitadas en el contrato de servicio con este atributo:

[ServiceContract(SessionMode=SessionMode.Required)] 
public interface IMyService { 
    // ... 
} 

recordar también que con el fin de mantener el estado entre las llamadas al servicio tendrá explícitamente para habilitar el modo instancia apropiada en la ejecución del contrato de servicios:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] 
public class MyService : IMyService { 
    // ... 
} 

Hay dos tipos de sesiones en WCF: Secure Sessions y sesiones confiables. La configuración predeterminada para wsHttpBinding y netTcpBinding es utilizar Secure Sessions.
Para wsHttpBinding, esto se lleva a cabo con seguridad de nivel de mensaje utilizando las credenciales del cliente, que es configuración predeterminada para el enlace.
Para netTcpBinding en su lugar, la sesión se establece en el nivel de transporte mediante el uso de las instalaciones del protocolo TCP.
Esto significa que simplemente al cambiar a wsHttpBinding o netTcpBinding se habilitará la compatibilidad con las sesiones de WCF.
La alternativa es usar Sesiones confiables. Esto tiene que estar explícitamente habilitado en la configuración de enlace y elimina el requisito de usar seguridad de mensaje para wsHttpBinding. Así que esto va a funcionar:

<bindings> 
    <wshttpbinding> 
     <binding name="ReliableSessionEnabled"> 
      <reliablesession enabled="True" ordered="False" /> 
      <security mode="None" /> 
     </binding> 
    </wshttpbinding> 
</bindings> 

8) Falso, Sesiones fiables se utilizan independientemente de la configuración de seguridad del canal de comunicación.

Para una explicación más detallada, eche un vistazo a this article.

+0

Gracias por la respuesta detallada. Una pregunta: en (7) usted dice que las sesiones se habilitan configurando la propiedad SessionMode. No encontré que esto sea cierto: sin habilitar también sesiones confiables obtuve "enlace no configurado para admitir sesiones" o algo así. Quizás será diferente ahora. –

+0

Actualicé la publicación con más información acerca de las Sesiones de WCF. ¿Tal vez estaba utilizando otro enlace, o tal vez usted deshabilitó explícitamente la seguridad? –

+0

Aquí hay un artículo útil: http://www.lybecker.com/blog/2007/04/30/wcf-sessions-and-reliable-messaging/ –

2

Siguiendo a través de una excelente respuesta de Enrico, estas son las configuraciones que estoy usando:

Servicio:

<services> 
    <service name="Foo.Bar.Service"> 
     <endpoint name="EndpointHttps" 
      address="" 
      binding="customBinding" bindingConfiguration="EndpointHttps" 
      contract="Foo.Bar.IService" /> 
    </service> 
</services> 
<bindings> 
    <customBinding> 
     <binding name="EndpointHttps"> 
      <reliableSession /> 
      <mtomMessageEncoding /> 
      <httpsTransport /> 
     </binding> 
    </customBinding> 
</bindings> 

Cliente:

<client> 
    <endpoint name="EndpointHttps" 
     address="https://server/FooBar/service.svc" 
     binding="customBinding" bindingConfiguration="EndpointHttps" 
     contract="Foo.Bar.IService" /> 
</client> 
<bindings> 
    <customBinding> 
     <binding name="EndpointHttps"> 
      <reliableSession /> 
      <mtomMessageEncoding /> 
      <httpsTransport /> 
     </binding> 
    </customBinding> 
</bindings> 

Nota: todavía no han conseguido que esto trabajar con la autenticación de Windows sin embargo.

+0

¿Cuál es el problema? –

Cuestiones relacionadas