+ Répondre à la discussion
Affichage des résultats 1 à 13 sur 13
  1. #1
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 114
    Points : 113
    Points
    113

    Par défaut [Source] MemberShipProvider et RoleProvider pour postgre (npgsql)

    Hello à tous,

    J'utilise PostGre comme base de donnée et je voulais pouvoir utiliser les contrôles .NET de gestion d'utilisateur. J'ai donc du écrire deux classes Provider (NpgsqlMembershipProvider et NpgsqlRoleProvider) qui surchagent les classes MembershipProvider et RoleProvider.

    Ces classes utilisent la librairie npsql installée lors de l'installation de PostGre.

    Je commence par la classe NpgsqlMembershipProvider. Pour commencer il est utile de lire la documentation sur la classe MembershipProvider. Et de jeter un oeil sur l'exemple d'implémentation trouvé ici.

    Après il m'as suffit de copier le code de l'exemple et de remplacer tous les accès base en utilisant les api npgsql (fichier joint NpgsqlMembershipProvider).

    De la même façon et à partir de la documentation de la classe RoleProvider et de l'exemple on obtient la classe NpgsqlRoleProvider (fichier joint NpgsqlRoleProvider).

    Il n'y a plus qu'a mettre à jour le web.config pour utiliser nos classes

    D'abord la chaîne de connection à la BDD :

    Code :
    1
    2
    3
    <connectionStrings>
        <add name="PgsqlLocalServer" connectionString="Server=127.0.0.1;Port=5432;Database=mabdd;User Id=monuser;Password=monpwd" providerName="Ngpgsql" />
    </connectionStrings>
    Pour ajouter le membership provider dans la section system.web

    Code :
    1
    2
    3
    4
    5
    <membership defaultProvider="NpgsqlMembershipProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="true" passwordFormat="Hashed" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0" name="NpgsqlMembershipProvider" type="NpgsqlMembershipProvider"/>
    	</providers>
    </membership>
    et enfin on ajoute le role provider

    Code :
    1
    2
    3
    4
    5
    <roleManager enabled="true" defaultProvider="NpgsqlRoleProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" applicationName="/" name="NpgsqlRoleProvider" type="NpgsqlRoleProvider"/>
    	</providers>
    </roleManager>
    Comme les mots de passe (dans mon cas) ne sont pas stockés en clair, j'ai du ajouter une clé de validation (pour crypter le mot de passe) :

    Code :
    <machineKey validationKey="maclef" validation="SHA1"/>
    Il faut aussi créer les tables dans votre base PostGre :

    Code :
    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
    CREATE TABLE users
    (
      applicationname text NOT NULL,
      username text NOT NULL,
      passwd text NOT NULL,
      email text NOT NULL,
      passwordquestion text,
      passwordanswer text,
      isapproved bit(1),
      islockedout bit(1),
      creationdate date,
      lastlogindate date,
      lastpasswordchangeddate date,
      lastlockedoutdate date,
      failedpasswordattemptcount integer,
      failedpasswordattemptwindowstart date,
      failedpasswordanswerattemptcount integer,
      failedpasswordanswerattemptwindowstart date,
      comments text,
      lastactivitydate date,
      CONSTRAINT users_primarykey PRIMARY KEY (applicationname, username)
    );
     
    CREATE TABLE roles
    (
      rolename text NOT NULL,
      applicationname text NOT NULL,
      CONSTRAINT roles_primarykey PRIMARY KEY (rolename, applicationname)
    );
     
    CREATE TABLE usersinroles
    (
      username text NOT NULL,
      rolename text NOT NULL,
      applicationname text NOT NULL,
      CONSTRAINT usersinrole_primarykey PRIMARY KEY (username, rolename, applicationname)
    );
    et voilà tout fonctionne bien avec les composants de l'onglets "Connexion" de VS2005.

    Logiquement si les classes NpgsqlMembershipProvider et NpgsqlRoleProvider sont compilées dans une dll avec nom fort cela devrait même pouvoir être gèrer via la console d'administration de VS2005 (pas tester).

    J'espère que cela vous sera utile

    Dès que j'ai le temps et que j'ai compris comment faire j'écrirai les classe qui permettent de surcharger la gestion du profil (via le web.config) pour PostGre. Mais la par contre la documentation expliquant cette surcharger est bcp plus hardu à lire
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Étudiant
    Inscrit en
    novembre 2003
    Messages
    3 830
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2003
    Messages : 3 830
    Points : 3 823
    Points
    3 823

    Par défaut



    Cela pourrait être une bonne entrée pour la page sources

    Logiquement si les classes NpgsqlMembershipProvider et NpgsqlRoleProvider sont compilées dans une dll
    Il serais peut être mieux que tu compiles et que tu mettes les binaires (donc la dll) en même temps que le source. Et si possible, un petit exemple pour le test, et ce sera parfait !

    Dès que j'ai le temps et que j'ai compris comment faire j'écrirai les classe qui permettent de surcharger la gestion du profil (via le web.config) pour PostGre.
    Au besoin, tu peux te faire aider par les guru du forum (en ouvrant un sujet dans le forum approprié).


  3. #3
    Expert Confirmé Sénior
    Avatar de Ditch
    Profil pro Didier Danse
    Inscrit en
    mars 2003
    Messages
    4 134
    Détails du profil
    Informations personnelles :
    Nom : Didier Danse
    Âge : 33

    Informations forums :
    Inscription : mars 2003
    Messages : 4 134
    Points : 8 515
    Points
    8 515

    Par défaut

    Citation Envoyé par dinguot
    Dès que j'ai le temps et que j'ai compris comment faire j'écrirai les classe qui permettent de surcharger la gestion du profil (via le web.config) pour PostGre. Mais la par contre la documentation expliquant cette surcharger est bcp plus hardu à lire
    Salut,

    J'ai expliqué en quelques mots ceci ici: http://ditch.developpez.com/aspnet2/...pprovider/#LVI Peut être cela peut être utile comme base très succincte

    Didier Danse

    Most Valuable Profesionnal SharePoint
    Microsoft Certified Application Developer
    Mes articles sur developpez.com
    Mon site perso


  4. #4
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 114
    Points : 113
    Points
    113

    Par défaut

    Je sais comment créer et utiliser un profile .
    Mais je veut pouvoir le stocker dans une base PosGre

    Tiens j'ai trouvé une doc

    Une bête classe à surcharger

  5. #5
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 114
    Points : 113
    Points
    113

    Par défaut

    Tiens en relisant mon premier post je vois que j'ai oublié un truc

    dans ces deux sections :

    Code :
    1
    2
    3
    4
    5
    <membership defaultProvider="NpgsqlMembershipProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="true" passwordFormat="Hashed" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0" name="NpgsqlMembershipProvider" type="NpgsqlMembershipProvider"/>
    	</providers>
    </membership>
    et enfin on ajoute le role provider

    Code :
    1
    2
    3
    4
    5
    <roleManager enabled="true" defaultProvider="NpgsqlRoleProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" applicationName="/" name="NpgsqlRoleProvider" type="NpgsqlRoleProvider"/>
    	</providers>
    </roleManager>
    on voit qu'il y a un paramètre "applicationName" que j'ai positionné à "/". Dans la description des tables :

    Code :
    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
    CREATE TABLE users
    (
      applicationname text NOT NULL,
      username text NOT NULL,
      passwd text NOT NULL,
      email text NOT NULL,
      passwordquestion text,
      passwordanswer text,
      isapproved bit(1),
      islockedout bit(1),
      creationdate date,
      lastlogindate date,
      lastpasswordchangeddate date,
      lastlockedoutdate date,
      failedpasswordattemptcount integer,
      failedpasswordattemptwindowstart date,
      failedpasswordanswerattemptcount integer,
      failedpasswordanswerattemptwindowstart date,
      comments text,
      lastactivitydate date,
      CONSTRAINT users_primarykey PRIMARY KEY (applicationname, username)
    );
     
    CREATE TABLE roles
    (
      rolename text NOT NULL,
      applicationname text NOT NULL,
      CONSTRAINT roles_primarykey PRIMARY KEY (rolename, applicationname)
    );
     
    CREATE TABLE usersinroles
    (
      username text NOT NULL,
      rolename text NOT NULL,
      applicationname text NOT NULL,
      CONSTRAINT usersinrole_primarykey PRIMARY KEY (username, rolename, applicationname)
    );
    on remarque que chaque table contient une propriété "applicationname".

    éh éh éh ... intéressant non ?

    Cela signifie que vous pouvez utiliser la même BDD pour gérer les utilisateurs de différent site à condition que le paramètre applicationName des providers (dans le web.config) soit personnaliser pour chaque site :

    pour le site 1 :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <membership defaultProvider="NpgsqlMembershipProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="Site1" requiresUniqueEmail="true" passwordFormat="Hashed" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0" name="NpgsqlMembershipProvider" type="NpgsqlMembershipProvider"/>
    	</providers>
    </membership>
    <roleManager enabled="true" defaultProvider="NpgsqlRoleProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" applicationName="Site1" name="NpgsqlRoleProvider" type="NpgsqlRoleProvider"/>
    	</providers>
    </roleManager>
    pour le site 2 :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <membership defaultProvider="NpgsqlMembershipProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="Site2" requiresUniqueEmail="true" passwordFormat="Hashed" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0" name="NpgsqlMembershipProvider" type="NpgsqlMembershipProvider"/>
    	</providers>
    </membership>
    <roleManager enabled="true" defaultProvider="NpgsqlRoleProvider">
    	<providers>
    		<add connectionStringName="PgsqlLocalServer" applicationName="Site2" name="NpgsqlRoleProvider" type="NpgsqlRoleProvider"/>
    	</providers>
    </roleManager>
    Et hop ! les utilisateurs des deux sites (Site1 et Site2) vont être gérer dans la même base (cétypasbô ça ).
    Mieux si les deux site utilise le même applicationName, alors là (et c'est l'extase !) les utilisateurs seront "mutualisés" sur les deux sites.

    Bref c'est rigolo et ça ouvre beaucoup de possibilités

  6. #6
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 114
    Points : 113
    Points
    113

    Par défaut

    Pour ceux que cela pourraient intéresser, voici le code de la fonction qui m'a permis de tester mes deux classes

    Code :
    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
    96
    97
    98
    99
    100
    101
    102
    protected void Button1_Click(object sender, EventArgs e)
        {
     
            try
            {
                //
                // Test de NpgsqlMembershipProvider
                //
     
                NpgsqlMembershipProvider tester = new NpgsqlMembershipProvider();
                NameValueCollection config = new NameValueCollection();
                MembershipUser user;
                MembershipCreateStatus status;
                NpgsqlProviderUserKey provideruserkey;
                int tot;
     
                config.Add("applicationName", "/");
                config.Add("maxInvalidPasswordAttempts", "5");
                config.Add("passwordAttemptWindow", "10");
                config.Add("minRequiredNonAlphanumericCharacters", "1");
                config.Add("minRequiredPasswordLength", "7");
                config.Add("passwordStrengthRegularExpression", "");
                config.Add("enablePasswordReset", "true");
                config.Add("enablePasswordRetrieval", "true");
                config.Add("requiresQuestionAndAnswer", "false");
                config.Add("requiresUniqueEmail", "true");
                config.Add("passwordFormat", "Encrypted");
                config.Add("connectionStringName", "PgsqlLocalServer");
     
                tester.Initialize(null, config);
                user = tester.CreateUser("name", "password", "email", "question", "answer", true, null, out status);
                switch (status)
                {
                    case MembershipCreateStatus.DuplicateEmail :
                        throw new Exception("DuplicateEmail");
                    case MembershipCreateStatus.DuplicateProviderUserKey :
                        throw new Exception("DuplicateProviderUserKey");
                    case MembershipCreateStatus.DuplicateUserName :
                        throw new Exception("DuplicateUserName");
                    case MembershipCreateStatus.InvalidAnswer :
                        throw new Exception("InvalidAnswer");
                    case MembershipCreateStatus.InvalidEmail :
                        throw new Exception("InvalidEmail");
                    case MembershipCreateStatus.InvalidPassword :
                        throw new Exception("InvalidPassword");
                    case MembershipCreateStatus.InvalidProviderUserKey :
                        throw new Exception("InvalidProviderUserKey");
                    case MembershipCreateStatus.InvalidQuestion :
                        throw new Exception("InvalidQuestion");
                    case MembershipCreateStatus.InvalidUserName :
                        throw new Exception("InvalidUserName");
                    case MembershipCreateStatus.ProviderError :
                        throw new Exception("ProviderError");
                    case MembershipCreateStatus.UserRejected :
                        throw new Exception("UserRejected");
                }
     
                tester.ChangePassword("name", "password", "newone");
                tester.ChangePasswordQuestionAndAnswer("name", "newone", "pouet", "pouetpouet");
                tester.FindUsersByEmail("email", 0, 1, out tot);
                tester.FindUsersByName("name", 0, 1, out tot);
                tester.GetAllUsers(0, 10, out tot);
                tester.GetNumberOfUsersOnline();
                tester.GetPassword("name", "pouetpouet");
                provideruserkey = new NpgsqlProviderUserKey();
                provideruserkey.UserName = "name";
                provideruserkey.ApplicationName = "/";
                tester.GetUser(provideruserkey, false);
                tester.GetUserNameByEmail("email");
                tester.ResetPassword("name", "pouetpouet");
                tester.UnlockUser("name");
                tester.UpdateUser(user);
                tester.ValidateUser("name", "newone");
     
                //
                // Test de NpgsqlRoleProvider
                //
     
                NpgsqlRoleProvider role = new NpgsqlRoleProvider();
     
                role.Initialize("NpgsqlRoleProvider", config);
                role.CreateRole("role");
                string[] users = { "name" };
                string[] roles = { "role" };
                role.AddUsersToRoles(users, roles);
                role.FindUsersInRole("role", "name");
                role.GetAllRoles();
                role.GetRolesForUser("name");
                role.GetUsersInRole("admin");
                role.IsUserInRole("name", "admin");
                role.RemoveUsersFromRoles(users, roles);
                role.RoleExists("role");
                role.DeleteRole("role", true);
     
                tester.DeleteUser("name", true);
                Resultm.Text = "c'est tout bon :)";
            }
            catch (NpgsqlException n)
            {
                Resultm.Text = n.Line + " : " + n.Message;
            }
        }

  7. #7
    Expert Confirmé Sénior
    Avatar de Aspic
    Homme Profil pro Florent Diedler
    Étudiant
    Inscrit en
    août 2005
    Messages
    3 821
    Détails du profil
    Informations personnelles :
    Nom : Homme Florent Diedler
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2005
    Messages : 3 821
    Points : 4 250
    Points
    4 250

    Par défaut

    Salut, pourrais tu envoyer un zip avec ta source complète ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  8. #8
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 114
    Points : 113
    Points
    113

    Par défaut

    je suis en train de bosser sur la surcharge de la classe profile provider pour npgsql

    je te ferai un lot groupé.

    Sinon le code du membreshipprovider et du role provider sont attaché au premier post

  9. #9
    Expert Confirmé Sénior
    Avatar de Aspic
    Homme Profil pro Florent Diedler
    Étudiant
    Inscrit en
    août 2005
    Messages
    3 821
    Détails du profil
    Informations personnelles :
    Nom : Homme Florent Diedler
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2005
    Messages : 3 821
    Points : 4 250
    Points
    4 250

    Par défaut

    Citation Envoyé par dinguot Voir le message
    je suis en train de bosser sur la surcharge de la classe profile provider pour npgsql

    je te ferai un lot groupé.

    Sinon le code du membreshipprovider et du role provider sont attaché au premier post
    Pas de soucis, dès que tout est pret, prévient nous
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : mars 2007
    Messages : 152
    Points : 59
    Points
    59

    Par défaut

    Salut à toutes et à tous,

    Tout d'abord merci à dinguot pour son tuto tellement clair que même moi je l'ai compris.

    J'ai toutefois un petit problème que mon niveau en ASP et c# ne me permet pas de résoudre sans votre aide.

    J'ai tout d'abord créé un bouton sur une page et un label nommé Resultm. Derrière le click du bouton le code de test du post #6.
    La réponse est "c'est tout bon ". J'en déduit donc que ça doit fonctionner.
    J'avais du toutefois placer le passwordFormat à clear pour une raison de clé.

    J'ai placé une CreateUserWizard sur ma page et j'ai essayé de créer un user.
    Lorsque je clique sur le bouton de création du user, je reçois le message suivant :
    L'exeption FormatException n'a pas été gérée par le code utilisateur
    Les caractères supplémentaires ne pouvant pas être analysés sont à la fin de la chaîne.
    Cette erreur s'applique à la ligne 222 du NpgsqlMembershipProvider.cs qui dit :

    returnBytes[i] =
    Convert.ToByte(hexString.Substring(i * 2, 2), 16);
    La valeur de i lors de l'erreur est 0 et le returnBytes a une dimension de 12. Les valeurs de 0 à 12 sont toutes à 0.

    Quel est le problème, et comment le résoudre ?

    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  11. #11
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 293
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 33
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : février 2004
    Messages : 19 293
    Points : 39 083
    Points
    39 083

    Par défaut

    C'est cool quand des gens envoient des trucs utiles au lieu de poser des questions
    Merci à toi dinguot
    J'ajoute ça à mes favoris, je sens que ça resservira...

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : mars 2007
    Messages : 152
    Points : 59
    Points
    59

    Par défaut Problème pour le login

    J'ai fini par résoudre le problème du codage du mot de passe, qui ne venait pas du fait que le passwordFormat était à Hashed.
    Dans le web.config j'ai mis le requiresQuestionAnswer à false.
    Dans le CreateUserWizard, les champs de question et de réponse n'apparaissaient donc plus, or si le passwordFormat est à Hashed, le mot de passe ET la réponse à la question sont encodés.
    Comme la réponse est donc à null, Elle ne peut forcément pas être encodée.

    En ajoutant juste un if (password != null) pour donner ceci dans le NpgsqlMembershipProvider.cs
    Code :
    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
    private string EncodePassword(string password)
    {
    string encodedPassword = password;
    if (password != null)
    {
    switch (PasswordFormat)
    {
    case MembershipPasswordFormat.Clear:
      break;
    case MembershipPasswordFormat.Encrypted:
      encodedPassword = Convert.ToBase64String(EncryptPassword(Encoding.Unicode.GetBytes(password)));
      break;
    case MembershipPasswordFormat.Hashed:
      HMACSHA1 hash = newHMACSHA1();
      hash.Key = HexToByte(machineKey.ValidationKey);
      encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));
      break;
    default:
      throw new ProviderException("Unsupported password format.");
    }
    }
    return encodedPassword;
    }
    
    De la sorte, si le password entré est null, il retournera null.
    Ce ne sera pas un problème pour le champs du mot de passe qui ne sera jamais null, puisqu'il y a un RequiredFieldValidator intégré dans le Wizard de sorte que le mot de passe ne soit pas null.

    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  13. #13
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 114
    Points : 113
    Points
    113

    Par défaut

    oulala 5 ans déjà que j'ai écris cette étude que je n'ai jamais eu le temps de finaliser.

    depuis le temps il existe une dll complète et plutôt pas mal pour postgre sql.
    elle se nomme npgsql.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •