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

Contribuez .NET Discussion :

[Source] MemberShipProvider et RoleProvider pour postgre (npgsql)


Sujet :

Contribuez .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <machineKey validationKey="maclef" validation="SHA1"/>
    Il faut aussi créer les tables dans votre base PostGre :

    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
    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
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    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é
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    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

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    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 éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Par défaut
    Tiens en relisant mon premier post je vois que j'ai oublié un truc

    dans ces deux sections :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    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 : 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
    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
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 905
    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 !

Discussions similaires

  1. [postgres+java+RPM] comment java pour postgres
    Par thief dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 18/09/2004, 17h52
  2. Hebergeur pour postgres ??
    Par elbandido dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 11/08/2004, 00h45
  3. la commande mysql_fetch_field pour postgre
    Par dim_italia dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 10/08/2004, 16h49
  4. qq'un conniat un driver OleDB pour postgres?
    Par hatake.kakashi dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 27/07/2004, 14h49
  5. [Kylix] Requetes Kylix pour postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 20h22

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