2009-01-09 24 views
8

Je n'arrive pas à comprendre comment activer des instances par session pour mon service WCF lors de l'utilisation de HTTPS. (Je ne suis pas un expert ASP.NET mais je ne veux pas utiliser l'état de session ASP.NET si possible.) J'utilise .NET Framework 3.0.Sessions WCF avec HTTPS

Je suis arrivé à la contradiction suivante et j'espère que quelqu'un peut me dire où il y a une faille dans la logique.

1) Le service doit être hébergé sur IIS 6 en raison du mandat du client.

2) Le service doit maintenir l'état entre les appels, y compris les instances SqlConnection et SqlTransaction (moche mais nécessaire en raison de contraintes de projet).

3) Par conséquent j'ai besoin d'utiliser le wsHttpBinding.

4) Le service doit pouvoir accéder aux informations d'authentification de l'utilisateur à partir de HttpContext.Current.User.Identity (par exemple en utilisant la sécurité Windows dans IIS).

5) HTTPS est donc requis.

6) La sécurité au niveau du transport doit donc être configurée sur la liaison.

7) Configurer le service pour exiger des sessions signifie que je dois configurer le wsHttpBinding pour utiliser des sessions fiables.

8) Cela nécessite que la sécurité au niveau du message soit configurée sur la liaison.

I.e. (6) et (8) s'excluent mutuellement.

Il semble que l'utilisation de sessions WCF nécessite que j'utilise la sécurité au niveau du message, ce qui m'empêche d'utiliser HTTPS.

Qu'est-ce qui me manque?

+0

Vous rencontrez des erreurs spécifiques avec cette configuration ou vérifiez-vous si cette configuration est réalisable? –

+0

Je voudrais savoir si la configuration est possible: c'est-à-dire des sessions WCF avec HTTPS. Merci. –

Répondre

15

3) vrai, wsHttpBinding et wsDualHttpBinding sont les seules liaisons HTTP qui prennent en charge les sessions

5) Faux, afin d'authentifier les appelants de services que vous ne doivent pas nécessairement avoir toute sécurité au niveau du transport (telle que SSL/HTTPS). La seule exigence est de configurer IIS pour activer l'authentification Windows intégrée pour un répertoire virtuel. Puis, en WCF vous avez trois possibilités pour permettre à ce scénario:

a) Utiliser la sécurité au niveau du transport sur le wsHttpBinding avec les informations d'identification de Windows (HTTPS)

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

b) Utiliser la sécurité au niveau des messages sur le wsHttpBinding avec les informations d'identification de windows (HTTP)

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

c) Exécutez votre service sous le mode de compatibilité ASP.NET et activer l'authentification windows dans ASPIC.NET (HTTP)

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

Notez que dans un et b vous accéder à l'identité de l'appelant à partir d'un service de cette façon:

OperationContext.Current.ServiceSecurityContext.WindowsIdentity 

6) vrai, le transport la sécurité de niveau doit être activée sur le wsHttpBinding afin d'utiliser HTTPS

7) Faux, Sessions fiables est une implémentation particulière de Reliable Messaging pour les sessions WCF. Reliable Messaging est une spécification standard WS- * conçue pour garantir la livraison des messages sur un réseau non fiable. Vous pouvez utiliser des sessions WCF sans messagerie fiable et vice versa. Les sessions sont activées sur le contrat de service avec cet attribut:

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

Rappelez-vous aussi que pour maintenir l'état entre le service appels que vous avez explicitement pour activer le mode d'instance appropriée sur la mise en œuvre du contrat de service:

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

Il existe deux types de sessions dans WCF: Sessions sécurisées et Sessions fiables. Le paramètre par défaut pour wsHttpBinding et netTcpBinding est d'utiliser Secure Sessions.
Pour wsHttpBinding, ceci est accompli avec sécurité au niveau du message en utilisant les informations d'identification du client, qui est le paramètre par défaut pour la liaison.
Pour netTcpBinding à la place, la session est établie au niveau de transport en utilisant les fonctionnalités du protocole TCP.
Cela signifie que le simple basculement vers wsHttpBinding ou netTcpBinding activera la prise en charge des sessions WCF.
L'alternative est d'utiliser Sessions fiables. Cela doit explicitement être activé dans la configuration de liaison, et supprime l'exigence d'utiliser la sécurité des messages pour le wsHttpBinding. Donc, cela fonctionnera:

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

8) Faux, sessions fiables sont utilisées indépendamment des paramètres de sécurité du canal de communication. Pour une explication plus détaillée, consultez this article.

+0

Merci pour la réponse détaillée. Une question: sous (7) vous dites que les sessions sont activées en définissant la propriété SessionMode. Je n'ai pas trouvé cela vrai: sans activer également des sessions fiables, j'ai obtenu une "liaison non configurée pour supporter des sessions" ou quelque chose comme ça. Peut-être que ce sera différent maintenant. –

+0

J'ai mis à jour le post avec plus d'informations sur les sessions WCF. Étiez-vous en train d'utiliser une autre liaison, ou peut-être avez-vous explicitement désactivé la sécurité? –

+0

Voici un article utile: http://www.lybecker.com/blog/2007/04/30/wcf-sessions-and-reliable-messaging/ –

2

Donnant suite à une excellente réponse de Enrico, ce sont les configs j'utilise:

Service:

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

Client:

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

Note: n'a toujours pas obtenu ce à Travailler avec l'authentification Windows cependant.

+0

Quel est le problème? –

Questions connexes