IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Communication Foundation .NET Discussion :

WCF, Authentification SQL


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut WCF, Authentification SQL
    Bonjour/Bonsoir,

    Je viens de passer plusieurs jours à suivre différents tutoriels plus ou moins complets à propos du moyen d'authentifier les accès au service WCF en utilisant les utilisateurs et les roles ASP.NET.

    Malheureusement je n'arrive pas à faire fonctionner la dite authentification. Je sais que je suis pas loin mais il n'y a rien à faire ca veux pas.

    Je sollicite donc votre aide pour trouver ce que j'ai raté dans ma configuration ou dans mon code.

    Je travaille sur un Vista avec VS2008, mon service est hebergé sur le IIS7 de ma machine. Le code du client est généré par VS.

    Voici une capture de l'outil d'admin IIS:


    Mon web.config est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    <?xml version="1.0"?>
    <configuration>
      <connectionStrings>
        <clear/>
    	  <add name="LocalSqlServer" connectionString="Data Source=KWISATZ\SQLEXPRESS;Initial Catalog=aspnetdb;Integrated Security=True"/>
    	</connectionStrings>
      <system.web>
        <membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
          <providers>
            <clear/>
            <add
              name="SqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider"
              connectionStringName="LocalSqlServer"
              applicationName="MembershipAndRoleProviderSample"
              enablePasswordRetrieval="false"
              enablePasswordReset="false"
              requiresQuestionAndAnswer="false"
              requiresUniqueEmail="true"
              passwordFormat="Hashed" />
          </providers>
        </membership>
        <roleManager enabled="true" defaultProvider="SqlRoleProvider">
          <providers>
            <clear/>
            <add name="SqlRoleProvider"
                 type="System.Web.Security.SqlRoleProvider"
                 connectionStringName="LocalSqlServer"
                 applicationName="MembershipAndRoleProviderSample"/>
          </providers>
        </roleManager>
    		<compilation debug="true">
    			<assemblies>
    				<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    				<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			</assemblies>
    		</compilation>
     
        <authentication mode="Forms" />
     
    	</system.web>
     
      <system.codedom>
    		<compilers>
    			<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    				<providerOption name="CompilerVersion" value="v3.5"/>
    				<providerOption name="WarnAsError" value="false"/>
    			</compiler>
    		</compilers>
    	</system.codedom>
     
      <!--system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    		<modules>
    			<add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    		</modules>
    		<handlers>
    			<remove name="WebServiceHandlerFactory-Integrated"/>
    			<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    		</handlers>
    	</system.webServer-->
    	<system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="MyServiceBinding">
              <security mode="Message">
                <message clientCredentialType="UserName" />
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
        <services>
          <service behaviorConfiguration="MyService.Service1Behavior" name="MyService.MyService">
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="" contract="MyService.IMyService">
              <!--<identity><dns value="localhost" /></identity>-->
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="MyService.Service1Behavior">
              <serviceDebug includeExceptionDetailInFaults="false" />
              <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider" />
              <serviceCredentials>
                <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlMembershipProvider" />
              </serviceCredentials>
              <serviceMetadata httpGetEnabled="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    	</system.serviceModel>
    </configuration>
    Le contrat du service est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    namespace MyService
    {
        [ServiceContract]
        public interface IMyService
        {
            [OperationContract]
            String HelloAdmin();
     
            [OperationContract]
            String HelloContrib();
     
            [OperationContract]
            String HelloAll();
        }
    }
    Voici la classe implémentant ce contrat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    namespace MyService
    {
        public class MyService : IMyService
        {
            [PrincipalPermission(SecurityAction.Demand, Role = "administrateur")]
            public string HelloAdmin()
            {
                return "Hello Admins";
            }
     
            [PrincipalPermission(SecurityAction.Demand, Role = "contributeur")]
            public string HelloContrib()
            {
                return "Hello Contribs";
            }
     
            [PrincipalPermission(SecurityAction.Demand)]
            public string HelloAll()
            {
                var identity = ServiceSecurityContext.Current.PrimaryIdentity;
                return "Hi All";
            }
        }
    }
    Dans le snippet ci-dessus vous pouvez voir un "var identity". La valeur de cet variable n'est jamais correcte.

    Maintenant voici le client qui utilise un user existant de la base de donnée ASP.NET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    namespace WCFServiceTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    var service = new MyServiceClient();
                    service.ClientCredentials.UserName.UserName = "plop";
                    service.ClientCredentials.UserName.Password = "42plop_42";
     
                    Console.WriteLine(service.HelloAll());
                    Console.WriteLine(service.HelloAdmin());
                    //Console.WriteLine(service.HelloContrib());
                }
                catch (SecurityAccessDeniedException e)
                {
                    Console.WriteLine("Acces Interdit : {0}", e.Message);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
    Dans le client de test l'appel à HelloAdmin lance une exception car l'authentification n'as pas lieu. L'appel à HelloAll lui fonctionne mais comme dit ci-dessus l'identité récupéré n'est pas correcte, c'est une identité de type Windows à la place d'une identité ASP.NET.

    Merci des pistes, solution et/ou de l'aide que vous pourrez m'apporter.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Personne n'as donc d'idée? Ou bien avez-vous besoin de plus de précisions?

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Dans le web.config la propriété bindingConfiguration n'est pas renseignée (avec MyServiceBinding je suppose). C'est normal ?
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Effectivement, j'avais oublié cette propriete là merci de me l'avoir fait remarqué.

    Seulement maintenant je suis confronté à un autre problème, j'ai cherché une solution ces deux derniers jours mais celà n'as pas donné quelquechose de convaincant.

    En effet j'ai lu qu'il fallais mettre le service en SSL pour pouvoir authentifier les utilisateurs. Je ne sais pas si c'est vrai mais par acquis de concience j'ai quand meme mis un certificat en place (chose qui m'as posé des soucis en particulier sur le fait qu'il faille retirer le mexHttpBinding pour que celà marche et ça ça ne se devine pas forcément).

    Enfin maintenant le certificat est en place, je peux me connecter sur le service en HTTPS et non plus en HTTP (normal). J'ai rafraichi ma référence de service dans mon client mais j'ai exactement le meme soucis qu'avant! Ci ce n'est que cette fois l'accès est complètement refusé.

    Je commence à désespérer de trouver une solution. Dès que je retrouve accès à mes sources je copierai le nouveau web.config et le app.config du client.

    A propos : Est-ce normal que lorsque j'ajoute une référence de service dans le client, VS me mette automatiquement le mode d'authentification à Windows et non pas à UserName comme définie dans le web.config du service? (J'ai testé dans les deux cas en changeant à la main l'authentificaton de marche pas plus dans un cas que dans l'autre).

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    C'est un peu normal ;

    ce que tu cherches c'est le mode d'authentification "none".

    Ensuite, tu dois rajouter une logique decustom header ou tu vas indiquer le user et le password au service et ainsi de suite.

Discussions similaires

  1. [SQL] Modification du "header" lors d'authentification sql
    Par nicolas2603 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 04/12/2006, 16h11
  2. Authentification SQL 2005
    Par BOUBOU81 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 29/06/2006, 11h08
  3. Probleme d'authentification SQL serveur 2k
    Par JEJELASPI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/05/2006, 12h11
  4. Authentification SQL Server 2000
    Par jh0483 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/08/2005, 12h10
  5. [SQL Server]Problème avec l'authentification SQL SERVER
    Par tidou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/04/2005, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo