Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
1901 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Sécurité WCF

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Sécurité WCF

n°2090787
snipeangel
BF3 snipeangel
Posté le 22-07-2011 à 10:06:01  profilanswer
 

Bonjour
 
Je cherche quelques sources sur le Net concernant le DUAL Authentication et la sécurité sur les WCF en général, je trouve pas mal de choses mais rien de réellement clair concernant la manière de configurer les app.config
 
Si vous avez des sources  n'hésitez pas à me poster des lien ;)
 
Merci :D


---------------
http://forum.hardware.fr/hfr/Achat [...] 0043_1.htm
mood
Publicité
Posté le 22-07-2011 à 10:06:01  profilanswer
 

n°2090935
Fred82
Posté le 22-07-2011 à 20:55:47  profilanswer
 

Moi ce que je fais pour blinder les services WCF, c'est appliquer deux techniques :
 
1) Authentification sur le serveur IIS qui contient les services WCF.
Dans le web.config :
<authentication mode="Forms">
      <forms loginUrl="Default.aspx" name=".ASPXFORMSAUTH" />
</authentication>
 
Création d'un service WCF à part qui sert à faire le login, et qui est autorisé sans authentification bien sûr.
FormsAuthentication.SetAuthCookie(login, RememberMe);
 
Le service WCF que tu dois protéger nécessite que ce cookie soit renseigné. Ceci est fait grâce donc aux réglages du web.config. On peut autoriser ou interdire les pages indiquées.
 
 <authorization>
      <deny users="?" />
    </authorization>
=> interdit les utilisateurs non authentifiés.
 
  <location path="images">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
=> autorise tous les utilisateurs pour accéder au répertoire "images".
 
2) La deuxième protection consiste à autoriser l'accès à certaines méthodes du service WCF à certains utilisateurs en particulier. Ceci est possible en utilisant les Behavior WCF.
 
Exemple d'une méthode WCF :
[OperationContract]
[AuthentificationBehavior(Droits = Droits.Consultation)]
public List<Machins> GetMachins()
{...}
 
AuthentificationBehavior est un attribut/une classe à définir comme décrit dans le lien suivant :
http://www.nayyeri.net/use-ioperat [...] ior-in-wcf
 
 
Quant à la Dual Authentication dont tu parles, je ne connais pas.

n°2091755
jogrey
Posté le 27-07-2011 à 15:22:15  profilanswer
 

Sur un projet on est en https, avec un userNameCredential :
 
   <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="DomainServiceModule"/>
            <add name="DomainServiceModule" preCondition="managedHandler" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </modules>
        <validation validateIntegratedModeConfiguration="false" />
    </system.webServer>
    <system.web>
        <httpModules>
            <!--<remove name="HttpsDomainServiceModule"/>-->
            <add name="HttpsDomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </httpModules>
        <compilation debug="true" targetFramework="4.0" />
        <customErrors mode="Off"/>
    </system.web>
 
    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ComposanteSol_Web.SuiviVolService.ServiceBehavior">
                    <serviceMetadata httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="true" />
                    <dataContractSerializer maxItemsInObjectGraph="65536000"/>
                    <serviceCredentials>
                        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ComposanteSol_Web.SuiviVolAuthentication, ComposanteSol_Web"/>
                    </serviceCredentials>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <customBinding>
                <binding name="ComposanteSol_Web.SuiviVolService.binaryHttps" sendTimeout="00:10:00" receiveTimeout="00:10:00">
                    <transactionFlow/>
                    <!-- <reliableSession/> -->
                    <security authenticationMode="UserNameOverTransport"></security>
                    <binaryMessageEncoding>
                        <readerQuotas
                          maxDepth="1734003200"
                          maxStringContentLength="1734003200"
                          maxArrayLength="1734003200"
                          maxBytesPerRead="1734003200"
                          maxNameTableCharCount="1734003200" />
                    </binaryMessageEncoding>
                    <httpsTransport/>
                </binding>
            </customBinding>
        </bindings>
        <services>
            <service name="ComposanteSol_Web.SuiviVolService" behaviorConfiguration="ComposanteSol_Web.SuiviVolService.ServiceBehavior">
                <endpoint name="SuiviVolService" address="" binding="customBinding" bindingConfiguration="ComposanteSol_Web.SuiviVolService.binaryHttps" contract="ComposanteSol_Web.SuiviVolService" >
                </endpoint>
                <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
            </service>
        </services>
    </system.serviceModel>
 
 
Un avantage, c'est la gestion des droits en dynamique avec OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name, un inconvénient, on a pas le [AuthentificationBehavior(Droits = Droits.Consultation)] :)

n°2092159
snipeangel
BF3 snipeangel
Posté le 29-07-2011 à 16:55:29  profilanswer
 

tout d'abord je tiens à vous remercier tous les deux d'avoir pris le temps de mettre des samples
Désolé pour la réponse tardive il y a quelques temps que je n'étais pas passé sur le topoc programmation, je vais voir si je peux appliquer ce que vous m'avez donné et je reviens vous donner des news ;)
 
edit OK près lecture de votre code, j'apporte quelques précisions, tout d'abord je ne suis pas sur de l'ASP.net mais sur une appli N Tiers destinée à être hébergée sur Azure
 
@ Fred Concernant la Dual Authentication Fred le but est d'avoir un certificat coté client et un autre coté serveur, sans ces certif aucune possiblité de faire dialogué le client et le serveur, c'est cette partie que je n'arrive pas à gérer (pour le moment j'ai du mal avec les certifs) mais en fait je commence a me demander si le problème ne viendrait pas de IIS puisque mes test se font directement en locale, il faudrait que je fasse un test en situation en hébergeant un projet sur Azure.
 
@ jogrey Merci pour le code je pense que de toute façon il faudra que j'implémente un UserNameAuthentication et tu m'as déjà fourni une base sympa ;) , pour le moment la reconnaissance des certif est ma priorité puisque de toute façon mon Boss veut que nous mettions en place le WIF et je ne suis pas sure que la sécu se gère exactement de la même façon .
 
Une petite question à tous les deux, vous avez beaucoup galéré sur le sécu  et la configuration des webServices via les fichiers de config, parce que je rame à mort, quasiment aucune info sur le Web... les trois quart des infos que je trouves les gars gèrent tout en code behind
 
Si vous avez des titres de bouquin pas trop mal foutus je suis preneur (j'ais déjà "Programming WCF" et "Programming Windows Identity Foundation" mais la partie sécu est super light :/);


Message édité par snipeangel le 29-07-2011 à 17:16:14

---------------
http://forum.hardware.fr/hfr/Achat [...] 0043_1.htm
n°2096922
jogrey
Posté le 23-08-2011 à 14:15:58  profilanswer
 

Oui, côté client, je n'ai pas eu le choix de le faire en c#, pas moyen de le faire marcher avec le xml....
 
Autre chose, le changement de user credential a la volée ne marche pas, il faut éteindre et ouvrir la connexion, et ré-enregistrer les callbacks (je le fais dans un listener d'event pour chaque consommateur)
 
 
     public void setCredentials(String user, String password, String fullName)
        {
            try
            {
                this.LocalComposanteSolServiceReference.ClientCredentials.UserName.UserName = user;
                this.LocalComposanteSolServiceReference.ClientCredentials.UserName.Password = password;
            }
            catch
            {
                LocalComposanteSolServiceReference.ChannelFactory.Close();
 
                //LocalComposanteSolServiceReference = new ComposanteSolServiceReference.SuiviVolServiceClient("SuiviVolService" );
                CustomBinding customBinding = new CustomBinding();
 
                SecurityBindingElement sbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
                sbe.IncludeTimestamp = true;
                BinaryMessageEncodingBindingElement bmebe = new BinaryMessageEncodingBindingElement();
                HttpsTransportBindingElement htbe = new HttpsTransportBindingElement();
                htbe.MaxReceivedMessageSize = 2147483647;
                htbe.MaxBufferSize = 2147483647;
 
                customBinding.Elements.Add(sbe);
                customBinding.Elements.Add(bmebe);
                customBinding.Elements.Add(htbe);
 
                EndpointAddress address = new EndpointAddress((new Uri(Application.Current.Host.Source, "/SuiviVolService.svc" ).AbsoluteUri));
 
                LocalComposanteSolServiceReference = new ComposanteSolServiceReference.SuiviVolServiceClient(customBinding, address);
 
 
                this.LocalComposanteSolServiceReference.ClientCredentials.UserName.UserName = user;
                this.LocalComposanteSolServiceReference.ClientCredentials.UserName.Password = password;
 
                EventManager.getInstance().OnServiceStarted(new EventManager.ServiceStartedEventArgs());
            }
            finally
            {
                EventManager.getInstance().OnCredentialsChanged(new EventManager.CredentialsChangedEventArgs(user, password, fullName));
 
                if (GUEST_USER.Equals(user))
                {
                    Connected = false;
                }
                else
                {
                    Connected = true;
                }
            }
        }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Sécurité WCF

 

Sujets relatifs
Risque de sécurité ?[resolved] PDO et la sécurité
[PHP/MYSQL] Sécurité suffisante ?Sécurité pour forcer le téléchargement d'une image
Sécurité des MP sur forum phpBB ?Première application WCF
VBS Avancé // Récupérer la liste des groupes de sécuritéServices WCF : Mettre un Invoker sur toutes les méthodes ? [résolu]
[ACCESS] Sécurité Base de Donnéessécurité formulaire
Plus de sujets relatifs à : Sécurité WCF


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware