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 Discussion :

[ASP.NET MVC] configuration de l'authentification dans web.config


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut [ASP.NET MVC] configuration de l'authentification dans web.config
    Bonjour,

    Pour faire suite à mon poste ici, j'ai choisi de gérer moi-même la sécurité de mon application web plutôt que de me reposer sur l'implémentation proposé par Microsoft et le framework qui utilise la base de donnée ASPNETDB.MDF, et dont je n'arrive pas à me connecter à ma base de donnée pour éxecuter les scripts de créations des tables utilisés par ASPNETDB.MDF.

    Du coup, je veux gérer la sécurité de mon application de la façon suivante:
    • Une table Users
    • Une table Roles
    • Une table Groups


    Le seul soucis est que je ne sais pas comment dire à mon application d'aller regarder dans ma base de donnée au lieu de la base ASPNETDB.MDF qui est la base par défaut utilisé par le framework pour géré les utilisateurs. Je suppose qu'il s'agit dans le web.config, mais je n'ai aucune idée des modifications à apporter au fichier pour lui dire de prendre ma base, plutôt qu'une autre.

    Si quelqu'un pouvait m'aider, j'en serais grandement reconnaissant (je me suis batus avec SQL Server, mais j'ai été mis KO =(

    Merci encore et bonne après-midi,

    L.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Points : 46
    Points
    46
    Par défaut
    Je ne sais pas si c'est la meilleure solution amis voici ce que moi j'utilise.

    Au niveau du web.config passe en mode authentification windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      <authentication mode="Windows">
        </authentication>
    J'ai également une chaine de connexion vers ma base qui gère les utilisateurs.


    Ensuite j'utilise l'AuthenticateRequest du Global.asax

    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
     
    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
    if (System.Web.HttpContext.Current.Request.IsAuthenticated)
     {
    System.Security.Principal.WindowsIdentity identity = (System.Security.Principal.WindowsIdentity)this.Context.User.Identity;
     
    this.Context.Cache.Remove(this.Context.User.Identity.Name);
    // Test l'existence d'un user en cache
    if (this.Context.Cache[identity.Name] == null)
    {
     // récupération des informations de sécurité en base (Profil)
    CustomPrincipal principal =  AuthentificationManager.CreateCustomPrincipal(identity);
     
    //   et  Mise en cache des informations de sécurité
    Context.Cache.Add(identity.Name, principal, null, DateTime.MaxValue, new TimeSpan(0, 20, 0), CacheItemPriority.Normal, null);
    }
      }
    }
    J'ai un objet users avec les propriétés (nom, prénom, is admin) et une procédure qui utilise la récupération des infos utilisateurs via un dataset.

    J'imagine que tu dois ainsi pouvoir récupérer les groupes et roles de l'utilisateur en question


    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
     
    public class CustomPrincipal : WindowsPrincipal
        {
     
            private Users _user = null;
     
     
            public CustomPrincipal(WindowsIdentity identity)
                : base(identity)
            {
                //
                //  j'utilise le login pour récup les infos via le usersmanagers. 
                // celui ci appelle une classe DAO qui remplit un dataset et instancie usr 
                string login = identity.Name.Split('\\')[1];
                 Users usr = EntitiesProvider.UsersManager.GetUserByLogin(login);
                if (usr.Login != null)
                {
                    _user = usr;
                }
     
            }
     
     
     
            public bool IsAdmin
            {
               //j'ai une propriété isAdmin, mais les rôles / profils de l'utilisateurs doivent pouvoir être récupérés de façon identique. 
                get { return _user.IsAdmin; }
            }
     
    etc

    pense à bien configurer iis aussi.


    j'espère que ça aidera

  3. #3
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut
    Merci bien pour ta réponse

    Par contre, je ne peux utiliser le mode Windows, pour moi c'est webforms obligatoirement puisque c'est une application accessible depuis Internet uniquement :/

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Points : 46
    Points
    46
    Par défaut
    Désolé, jamais fait d'authentification webform, je ne sais pas si cela fonctionne de façon identique.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 31
    Points : 30
    Points
    30
    Par défaut
    Un petit indice, dans le fichier web.config

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <authentication mode="Forms"/>

  6. #6
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut
    Merci, j'avais déjà effectué la modification ^^

    Ce que je cherche à faire, c'est de dire au framework d'aller utiliser mes tables à moi, plutôt que celle dans la base de donnée ASPNETDB.MDF ; )

  7. #7
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    voila comment je procède sur mon appli mvc:

    mon contrôleur a cette action:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     // GET: /Localisation/ListGroup/id
            [Authorize(Roles = "admin,test")]
            public ActionResult Index()
            {
     
                return View("Index");
            }
    L'action n'est autorisée qu'aux rôles admin et test. Et dans mon login j'ai cela :

    J'ai un service qui appelle ma base de données pour voir si les credentials sont bons.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ServiceUser su = new ServiceUser();
            List<string> roles;
     
            UserProvider up = new UserProvider();
     
            if (su.LoginUser(ref up , userName, password))
            {
               CurrentUser = up;
    Ensuite si tout a bien, je récupère les rôles associés a cet utilisateur et je fais une string séparé par des points virgules.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
             roles = su.LoadRoleRing(userName);
                string role =string.Empty;
     
                if (roles.Count > 0)
                {
                    roles.ForEach(x => role += x + ";");
                    role = role.Substring(0, role.Length - 1);
                }
    j'utilise cette string dans la création d'un ticket

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                        1,                              	// version
                        userName,       	  			  	// user name
                        DateTime.Now,                   	// issue time
                        DateTime.Now.AddMinutes(30),       	// expires soon
                        false, 				            	// persist cookie
                        role                    			// roles
                    );
    Je passe le tout dans un cookie d'authentification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
                Response.Cookies.Add(cookie);
    Et je redirige ou il faut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                string returnUrl = Request.QueryString["ReturnUrl"];
     
                if (string.IsNullOrEmpty(returnUrl))
                {
                    returnUrl="/masection/index.aspx";
                }
     
                Response.Redirect(returnUrl);
            }
    }
    Ensuite dans le global.asax , je recuepre mon cookie pour parvenir a mon authentification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
            if (HttpContext.Current.User != null) {
                if (HttpContext.Current.User.Identity.IsAuthenticated) {
                    if (HttpContext.Current.User.Identity is FormsIdentity) {
                        FormsIdentity fid = (FormsIdentity)Context.User.Identity;
                        FormsAuthenticationTicket t = fid.Ticket;
                        string[] roles = t.UserData.Split(';');
                        Context.User = new GenericPrincipal(fid, roles);
                    }
                }
            }
        }
    Et voilá, sans passer par les tables de windows, car c'est mon service User qui va chercher les infos et il le fait comme il le souhaite.

    bon code à toi, en espérant t'avoir aidé!

    [edit]
    Suite À quelques demandes, voici le bout de code pour changer la page, ou l'Action du controller qui effectue le login a placer dans web.config, system.web :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <authentication mode="Forms">
             <forms name=".ASPXAUTH" loginUrl="~/sectionAdmin/login.aspx" enableCrossAppRedirects="true" />
    </authentication>
    En espérant que cela vous aura aidé..
    [/edit]

  8. #8
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut
    Hello,

    Oui ça m'aide beaucoup à mieux voir le problème. Le seul soucis c'est que je ne sais pas ou placer tout ces bouts de code. C'est la première fois que je fais l'authentification, j'ai les concepts bien en tête, mais je ne sais pas ou placer le code pour faire en sorte que cela fonctionne : /

    Je suis donc toujours bloqué

  9. #9
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    et bien tout ce que j'ai pu te mettre se place dans la fonction login la ou tu vas faire ton formulaire d'authentification, à part le dernier bout qui lui se trouve dans le global.asax .

  10. #10
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut
    Ok. Je vais voir comment j'arrive à faire la chose.

    J'ai également acheté un bouquin sur la sécurité d'asp.net 3.5 pour m'aider sur le sujet

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2015, 01h28
  2. Réponses: 3
    Dernier message: 15/12/2014, 17h39
  3. ASP.NET MVC 4 beta disponible : introduction de Web API
    Par Hinault Romaric dans le forum ASP.NET MVC
    Réponses: 7
    Dernier message: 28/09/2013, 16h50
  4. Réponses: 13
    Dernier message: 03/03/2010, 23h30

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