none
WCF Binding RRS feed

  • Question

  • Bonjour

    Encore et toujours des soucis de configuration...

    Tout d'abord le contexte, plusieurs services WCF ont été développés et publiés dans le réseau d'une entreprise

    Certains d'entre eux vont finalement être exposés sur le Web pour alimenter des sites web.

    Le problème de la sécurité et de l'optimisation se pose donc...

    1er constat ces service sont en framwork 4. Le binding utilisé est "basicHttpBinding".

    Si j'ai bien compris il est obsolète.

    J'avais pensé utiliser "webHttpBinding".

    Armé de courage, j'ouvre l'outil de paramétrage des WCF (service configuration editor) je modifie le type de binding.

    Puis sur une de mes applications clients je mets à jour la référence du service.... Plantage au run...

    Je tente de supprimer et la recréer mais rien à faire ...ça re-plante

    Je regarde le app.config de mon application cliente la borne "system.serviceModel" n'a pas été configurée... Pourtant le service semble accessible au design.


    FB

    jeudi 16 octobre 2014 12:41

Réponses

  • Bonjour,

    HTTPS est requis pour éviter que les informations d'authentification circule en clair sur le réseau.
    HTTPS nécessite un certificat qui doit être connu par le client.

    Le certificat dans le cadre de HTTPS permet de chiffrer les requêtes HTTP et de valider son expéditeur.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    mercredi 22 octobre 2014 23:08
    Modérateur

Toutes les réponses

  • Côté Serveur (Service WCF) :

      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WcfGrangeCat.WCFCatBehavior">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IWCFCat" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
                     receiveTimeout="00:40:00" sendTimeout="00:40:00" closeTimeout="00:40:00" openTimeout="00:40:00" >
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
    
            </binding>
          </basicHttpBinding>
        </bindings>
        <services>
          <service behaviorConfiguration="WcfGrangeCat.WCFCatBehavior" name="WcfGrangeCat.WCFCat">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFCat" contract="WcfGrangeCat.IWCFCat"/>
          </service>
        </services>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
      </system.serviceModel>

    Coté Client :

    <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IWCFCat" receiveTimeout="00:10:00"
              sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
            </binding>
            <binding name="BasicHttpBinding_IWCFPhoto" receiveTimeout="00:10:00" closeTimeout="00:30:00"
              sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" />
          </basicHttpBinding>
        </bindings>
        <client>
    
          <endpoint address="http://localhost:56288/WCFCat.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFCat" contract="WCFCat.IWCFCat" name="BasicHttpBinding_IWCFCat" />
          <endpoint address="http://localhost:56888/WCFPhoto.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFPhoto" contract="WCFPhoto.IWCFPhoto" name="BasicHttpBinding_IWCFPhoto" />
    
        </client>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    
      </system.serviceModel>


    FB


    jeudi 16 octobre 2014 12:44
  • Personne pour me filer un coup de main pour :

    1. Me conseiller sur un nouveau Binding (Performant )
    2. Me conseiller sur la sécurité (Je souhaite une authentification métier au travers de ma base de données)

    Mon besoin étant de conserver des données côté serveur (pour ne pas avoir à me ré-authentifier à chaque accès). J'avais positionné le service ainsi : InstanceContextMode:=InstanceContextMode.PerSession

    Mais dans ce cas, j'ai constaté de grosses baisses de perf (Au lieu de Single)

    Mes WCF servent essentiellement à me retourner les Listes de données les mettre à jour et lancer des traitements .


    FB

    vendredi 17 octobre 2014 09:42
  • Bonjour,

    Me conseiller sur un nouveau Binding (Performant )
    basicHttpBinding est un Binding performant au niveau HTTP.

    • Me conseiller sur la sécurité (Je souhaite une authentification métier au travers de ma base de données)
    Règle n°1 en informatique, on ne fait jamais sont propre système d'authentification, mais on réutilise un déjà existant on des centaines d'ingénieurs en sécurité ont travaillé dessus (Active Directory, ASP .NET Membership,...).
    Sinon, vous pouvez suivre cet article qui explique comment customiser l'authentification, mais faites attention à ce que vous implémentez : http://www.codeproject.com/Articles/698862/Custom-Authentication-and-Authorization-in-WCF

    Mon besoin étant de conserver des données côté serveur (pour ne pas avoir à me ré-authentifier à chaque accès).
    L'authentification n'est pas fait à chaque accès, mais lorsque le client ouvre un Channel. Cela est indépendant du réglage InstanceContextMode. 

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    dimanche 19 octobre 2014 21:32
    Modérateur
  • Mmmmmh après réflexion, j'ai fait confusion entre identification du client (notion purement applicative) et sécurité du service WCF

    Mon besoin serait de tout simplement d'empêcher que n'importe qui puisse exploiter mes services WCF.

    Si j'ai bien compris meme en basicHttpBinding je peux activer la sécurité et j'ai le choix à 2 modes :

    Message ou Transport.

    Dans les 2 cas, j'ai vu une notion de certificat.

    Je n'ai pas trouvé dans le IIS manager de  mon serveur Web comment créer un certificat.

    Avez vous des tuto pour me guider pour créer un certificat et mettre en place ce type de sécurité?


    FB

    lundi 20 octobre 2014 09:29
  • Un certificat SSL est il impératif dans tous les cas?

    FB

    lundi 20 octobre 2014 10:29
  • Bonjour,

    Le certificat permet surtout de chiffrer la communication (HTTPS).
    Il peut être utilisé aussi pour authentifier les utilisateurs, mais il faudra fournir le certificat à chaque utilisateur.

    Mmmmmh après réflexion, j'ai fait confusion entre identification du client (notion purement applicative) et sécurité du service WCF. Mon besoin serait de tout simplement d'empêcher que n'importe qui puisse exploiter mes services WCF.
    Les 2 concepts sont liés. Si vous mettez en place l'authentification dans vos services WCF (via l'authentification Windows, ASP .NET, certificats ou custom,...), votre client devra s'authentifier sinon WCF refusera la consommation des opérations exposés par votre service.

    Je n'ai pas trouvé dans le IIS manager de  mon serveur Web comment créer un certificat.
    Sélectionnez le nœud de votre "Serveur" dans l'arborescence à gauche de la console IIS... Et ensuite sélectionnez dans les fonctionnalités du serveur l'option Certificate Manager.

    Attention, la création d'un certificat bidon (fait par vous même) pour authentifier et/ou chiffrer les communications nécessitent à ce que l'utilisateur fasse confiance à votre certificat (des réglages seront nécessaires de son côté).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 20 octobre 2014 10:46
    Modérateur
  • Plusieurs profils ont accès aux servicesWCF :

    1) Accès web / Utilisateur publique

    2) Accès Interne / Utilisateur inscrit sur l'Active Directory du domaine

    Pour répondre à votre remarque :

    "Règle n°1 en informatique, on ne fait jamais sont propre système d'authentification, mais on réutilise un déjà existant on des centaines d'ingénieurs en sécurité ont travaillé dessus (Active Directory, ASP .NET Membership,...)."

    Si tout était si simple mon métier n'existerait pas :)

    Dans mon cas, je suis tributaire de l'existant et l'architecture est complexe.

    Plus basiquement, mon besoin serait d'utiliser un user/mot de passe par profil d'utilisateur pour exploiter mes services WCF.

    Et je n'ai rien trouver en standard.

    Avez vous une idée?

    Merci


    FB

    lundi 20 octobre 2014 13:37
  • J'ai tenté de suivre la procédure suivante :

    http://msdn.microsoft.com/fr-fr/library/aa702565(v=vs.110).aspx

    J'ai placé le validator dans une librairie référencée à mon service WCF.

    Le Web.Config est ainsi :

     <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WcfGrangeCat.WCFCatBehavior">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
              <serviceCredentials>
                <userNameAuthentication userNamePasswordValidationMode="Custom"  customUserNamePasswordValidatorType="GrangeCatValidator.GrangeCatUserNameValidator, GrangeCatValidator"/>
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IWCFCat" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" receiveTimeout="00:40:00" sendTimeout="00:40:00" closeTimeout="00:40:00" openTimeout="00:40:00">
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
              <security mode="Message">
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
        <services>
          <service behaviorConfiguration="WcfGrangeCat.WCFCatBehavior" name="WcfGrangeCat.WCFCat">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWCFCat" contract="WcfGrangeCat.IWCFCat"/>
          </service>
        </services>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
      </system.serviceModel>

    Et j'ai l'erreur :

    La liaison BasicHttp exige que le type BasicHttpBinding.Security.Message.ClientCredentialType soit équivalent à celui des informations d'identification BasicHttpMessageCredentialType.Certificate pour les messages sécurisés. Sélectionnez la sécurité TransportWithMessageCredential ou Transport pour les informations d'identification UserName.

    mardi 21 octobre 2014 21:11
  • Si je comprends bien HTTPS et un certificat sont imposés dans tous les cas....Je me trompe?

    Voici encore une fois un cas ou votre règle 1 n'est pas applicable...

    Mise à part dans le monde de Bisounours :)


    FB

    mercredi 22 octobre 2014 07:49
  • Bonjour,

    HTTPS est requis pour éviter que les informations d'authentification circule en clair sur le réseau.
    HTTPS nécessite un certificat qui doit être connu par le client.

    Le certificat dans le cadre de HTTPS permet de chiffrer les requêtes HTTP et de valider son expéditeur.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    mercredi 22 octobre 2014 23:08
    Modérateur