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

ASP.NET MVC Discussion :

authentification des utilisateurs, quelle procédure choisir ?


Sujet :

ASP.NET MVC

  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par défaut authentification des utilisateurs, quelle procédure choisir ?
    Bonjour,

    Bon voila, je suis en cours de réalisation d'un site web asp.net MVC
    Ma base de production est une base de donnée oracle.
    Maintenant pour l'étape d'authentification je me demande si il est plus judicieux de garder la base de donnée SQL qui est créée automatiquement (il faudra ajouter l'information du matricule lors de la création du compte- information capitale qui me permettra de faire le lien avec la base de donnée de production).
    Ou bien créer une table utilisateur dans la base oracle où stocker les informations d'authentification (utilisation de l'authentification par apparences-membership- mais aucun exemple trouvé sur le net )

    Si quelqu'un peu m'aider
    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Salut Dodo86,

    Je ne sais pas de qu'elle base de donnée tu parle quand tu dis qu'il y en a une de créé automatiquement, car j'en ai pas qui se créé quand je fais un nouveau projet ... mais bon, n'importe comment, je pense que le choix le plus judicieux est de se connecter à la base de données de production qui contient déjà les informations des utilisateurs.

    Donc moi de mon coté, pour gérer l'authentification et les rôles des utilisateurs (j'espère que c'est bien ça que tu veux faire), j'ai utilisé l'authentification par Formulaire (il y a plein de tuto qui montrent ça sur le net, c'est le <authentication mode="Forms"> ... </authentication> à rajouter dans le web.config ).

    Et pour interroger ma base de données lors de l'identification et pour voir les rôles de l'utilisateur, j'ai créé mes propres "Provider" ( SqlMembershipProvider et SqlRoleProvider pour récupérer les utilisateurs et rôles).

    Une fois que ces différents points sont faits, tu peux gérer les accès à tes pages via les attributs [Authorize(Users="user1, user2")], [Authorize(Roles="Role1, Role2")].

    Voilà, j'espère que cela te donne déjà une piste de départ.

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par défaut
    Merci jonathan3357,

    OUI c'est de cela que je veux parler. Est ce la même procédure à suivre pour une base de production oracle? dois je créer mes propres "provider" moi aussi?

    et merci encore une fois de m'avoir mis sur la piste

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    En fait c'est juste le connecteur qui change, après derrière il y a +/- les mêmes opérations, donc oui tu peux créer ton propre provider utilisant le connecteur d'oracle pour accéder à ta base.

    Après je viens de voir qu'Oracle a mis à disposition des providers (http://www.oracle.com/technology/tec...net/index.html), je ne les ai jamais utilisés, mais cela peut éviter d'avoir à recréer la poudre , il suffit juste de voir comment configurer le provider afin qu'il attaque la bonne table de la bonne base, etc ...

    Voila

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par défaut Le schéma de ASPNETDB.MDF
    Je viens de trouver la base de donnée qui est créée automatiquement par VS ASPNETDB.MDF dans le répertoire App_Data elle contient plusieurs tables.
    dois je recréer tous le schéma sur ma base de donnée ou dois je me contenter des deux tables aspnet_membership et aspnet_Roles .
    Les autres ont elles un intérêt (aspnet_Users, aspnet_UsersInRole, aspnet_Paths, ....) ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Mais est-ce qu'actuellement les informations des utilisateurs sont déjà existante dans ta base (tu parlais d'une table qui stockait le matricule, j'imagine que derrière le matricule il doit y avoir encore d'autres informations ...)

    Parce que le "problème" que j'ai vu avec le provider d'oracle (comme celui pour sql server), c'est qu'il y a un schéma prédéfini de base, donc c'est pour ca que j'avais recréer mon provider afin de pouvoir interroger mes tables.

    Donc si tu veux je peux te donner un exemple :

    Mes tables utilisateurs et roles :
    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
     
    CREATE TABLE SITE_USER(
    	USE_id int IDENTITY(1,1)   NOT NULL,
    	USE_login varchar(50)      NOT NULL,
    	USE_password varchar(255)  NOT NULL,
    	USE_name varchar(100)      NULL,
    	USE_firstName varchar(100) NULL,
    	USE_mail varchar(100)      NOT NULL,
    	USE_creation datetime      NULL,
    	USE_lastConnexion datetime NULL,
    	USE_actif int              NOT NULL)
     
    ALTER TABLE SITE_USER ADD CONSTRAINT PK_SITE_USER PRIMARY KEY CLUSTERED (USE_id)
     
    -- ----------------------------------------------------------
     
    CREATE TABLE SITE_AUTHORIZATION(
    	AUT_ID int IDENTITY(1,1) NOT NULL,
    	AUT_Code varchar(50) NOT NULL,
    	AUT_Libelle varchar(255) NOT NULL)
     
    ALTER TABLE SITE_AUTHORIZATION ADD CONSTRAINT PK_SITE_AUTHORIZATION PRIMARY KEY CLUSTERED (AUT_ID)
     
    -- ----------------------------------------------------------
    CREATE TABLE USER_AUTHORIZATION(
    	USE_ID int NOT NULL,
    	AUT_ID int NOT NULL)
     
    ALTER TABLE USER_AUTHORIZATION
    	ADD CONSTRAINT PK_USER_AUTHORIZATION
    	PRIMARY KEY CLUSTERED (USE_ID, AUT_ID)
     
    ALTER TABLE USER_AUTHORIZATION  
    	WITH CHECK ADD  CONSTRAINT FK_USER_AUTHORIZATION_SITEUSER 
    	FOREIGN KEY(USE_ID) 
    	REFERENCES SITE_USER (USE_ID)
     
     
    ALTER TABLE USER_AUTHORIZATION 
    	WITH CHECK ADD  CONSTRAINT FK_USER_AUTHORIZATION_AUTHORIZATION
    	FOREIGN KEY(AUT_ID)
    	REFERENCES SITE_AUTHORIZATION (AUT_ID)
    Mon SqlMembershipProvider :
    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
     
     public class WIXELSQLProvider : SqlMembershipProvider
        {
     
            public override bool ValidateUser(string username, string password)
            {
                return (WixelDAO.GetAuthUser(username, password) != null);
            }
     
            public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
            {
                if (WixelDAO.CreateUser(username, password, email))
                {
                    status = MembershipCreateStatus.Success;
                    return GetUser(username, true);
                }
                else
                {
                    status = MembershipCreateStatus.ProviderError;
     
                    if (WixelDAO.MailExists(email))
                        status = MembershipCreateStatus.DuplicateEmail;
                    if (WixelDAO.UserExists(username))
                        status = MembershipCreateStatus.DuplicateUserName;
                    return null;
                }
     
            }
     
            public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
            {
                MembershipUserCollection col = new MembershipUserCollection();
                MembershipUser user = GetUser(usernameToMatch, true);
                if (user != null) col.Add(user);
                totalRecords = col.Count;
                return col;
            }
     
            public override MembershipUser GetUser(string username, bool userIsOnline)
            {
                SITE_USER user = WixelDAO.GetUser(username);
                if (user == null) return null;
                else
                {
                    return new MembershipUser(null, user.USE_login, null
                                              user.USE_mail, null, null,
                                              true, false, DateTime.Now, DateTime.Now,
                                              DateTime.Now, DateTime.Now, DateTime.Now);
     
                }
     
            }
        }
    La modification dans le web.config pour qu'il puisse etre utilisé dans le site :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <membership>
          <providers>
            <clear/>
            <add name="AspNetSqlMembershipProvider" type="Wixel.Models.WIXELSQLProvider" connectionStringName="ApplicationServices"
               enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
               maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
               applicationName="/" />
          </providers>
        </membership>

    Mon role provider :
    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
     
    public class WIXELRoleProvider : SqlRoleProvider
        {
            public WIXELRoleProvider()
                : base()
            {
            }
     
            public override string[] GetRolesForUser(string username)
            {
                List<USER_AUTHORIZATION> auths = WixelDAO.getUserAuthorizations(username);
                List<String> roles = new List<String>();
                if (auths != null)
                    foreach (USER_AUTHORIZATION auth in auths)
                        roles.Add(auth.SITE_AUTHORIZATION.AUT_Code);
                return roles.ToArray();
            }
     
            public override bool IsUserInRole(string username, string roleName)
            {
                return WixelDAO.IsUserInRole(username, roleName);
            }
     
        }
    La modif dans le web.config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider">
          <providers>
            <clear/>
            <add name="AspNetSqlRoleProvider" type="Wixel.Models.WIXELRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
          </providers>
        </roleManager>
    En fait j'ai juste surchargé les fonctions que j'avais besoin pour le moment, si par la suite je veux rajouté des fonctionnalités (je débute aussi dans le MVC), je rajouterai les fonctions nécessaires. Donc je pense que toi tu devras partir de OracleMembershipProvider et OracleRoleProvider, tu les surcharges afin de te connecter à ta base et aux bonnes tables, et après ca devrait fonctionner

    Après j'ai pour le moment utilisé le système de Login qui est créé par défaut quand tu créé un projet MVC 2.0 sous Visual Studio 2010.

  7. #7
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par défaut
    Merci pour la réponse
    je pense garder ORACLEROLEPROVIDER tel quel pour la gestion des roles et créer MYORACLEMEMBERSHIPPROVIDER (personnalisé) pour la gestion des utilisateurs.
    mais le probleme c'est que comme tu l'a si bien précisé est que le schéma de la base de donnée est différent ! je voudrais rajouter deux Colonnes à la table ORA_ASPNET_USERS : MATRICULE ET CLEPERS.

    et rajouter un nouveau status : DUPLICATEMATRICULE

    Mais la classe fait appel à une procédure stockée ORA_MEM_CREATEUSER qui est totalement opaque que je devrait redéfinir aussi

    Comment savoir que je ne rien omis, comment as tu fait ?

  8. #8
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 28
    Par défaut Merci
    désolé pour le retard
    ci joint un lien qui n'utilise pas des procédures stockées mais plutôt des requêtes SQL qui peuvent servir a écrire le corps des procédures

    http://msdn.microsoft.com/en-us/library/6tc47t75.aspx

    merci encore jonathan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tunneliser l'authentification des utilisateurs ?
    Par kaukos dans le forum Sécurité
    Réponses: 2
    Dernier message: 17/05/2007, 12h21
  2. Authentification des utilisateurs dans une application web
    Par mejdac dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 22/03/2007, 14h17
  3. Réponses: 4
    Dernier message: 31/10/2006, 19h01
  4. Réponses: 2
    Dernier message: 26/01/2005, 21h00

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