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] incompréhension dans la gestion des roles du sitemap


Sujet :

ASP.NET

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [asp.net] incompréhension dans la gestion des roles du sitemap
    bonjour,

    J'utilise pour mon site un objet sitemap, et un custom role provider dans lequel je gère moi-même un ou deux rôles, selon l'utilisateur.


    voici mon fichier web.sitemap :

    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
     
     
    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization="true" >
        <siteMapNode url="Default.aspx" title="Menu"  description="" >
          <siteMapNode url="" title="$resources: local, menu_vehicle" roles="VEH_VIEW">
            <siteMapNode url="Main.aspx" title="$resources: local, menu_vehiclelist" roles="VEH_VIEW" />
            <siteMapNode url="~/VehicleCreation.aspx?Mode=insert" title="$resources: local, menu_createvehicle"  roles="VEH_MODIFY" />
            <siteMapNode url="~/VehicleModification.aspx?Mode=edit" title="$resources: local, menu_modifyvehicle"  roles="VEH_MODIFY" />
            <siteMapNode url="~/VehicleModification.aspx?Mode=del" title="$resources: local, menu_removevehicle" roles="VEH_MODIFY"/>
          </siteMapNode>
     
          <siteMapNode title="$resources: local, menu_equipement" url="" description="" roles="VEH_VIEW" >
            <siteMapNode title="$resources: local, menu_equipmentlist" url="~/EquipmentList.aspx" roles="VEH_VIEW" />
            <siteMapNode title="$resources: local, menu_attacheequipement" url="~/AttachEquipment.aspx" roles="VEH_MODIFY"/>
            <siteMapNode title="$resources: local, menu_detachequipement" url="~/DetachEquipment.aspx" roles="VEH_MODIFY"/>
          </siteMapNode>
     
          <siteMapNode url="~/Parameters.aspx" title="$resources: local, menu_parameters" description="" roles="VEH_VIEW">
          </siteMapNode>
        </siteMapNode>
    </siteMap>

    et du point de vue des autorisation, le web.config ne contient que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        <authorization>
          <deny users="?"/>
        </authorization>
    Résultat :

    - Si on ne met aucun droit, le noeud "menu_parameters" reste affiché.

    - Si on ne met que le droit "VEH_VIEW", tout l'arbre est affiché, y compris les sous-menus déroulants, alors que la plupart devraient être cachés, en l'absence du rôle "VEH_MODIFY".


    Je n'arrive pas à comprendre la logique du système, est-ce un bug de la génération de l'arbre (je ne pense pas vu que personne n'a signalé un tel comportement sur les différents forums que j'ai pu voir, ou un système de droits extérieur (les autorisations de IIS ?) vient-il parasiter le système ?


    Question subsidaire : Y a t-il un moyen de m'affranchir du droit "VEH_VIEW" pour autoriser par défaut toutes les noeuds actuellement liés à "VEH_VIEW" ? Quel syntaxe est la bonne ?

    -roles="*"
    -roles=""
    -pas d'attribut "roles" ?

    Merci d'avance...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    En regardant très vite ton fichier sitemap, il me semble que cela est normal que tout s'affiche avec le role "VEH_VIEW".
    Tu as deux Root ?
    Je débute avec le sitemap, mais ce que j'ai fait est un role different pour chaque page et le root contenant l'ensemble des pages, prendra tous les roles.
    Second Root, avec les roles (different du premier root) des pages.

    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
     
     
       <siteMapNode url="Default.aspx" title="Menu"  description="" >
          <siteMapNode url="" title="$resources: local, menu_vehicle" roles="VEH_VIEW">
            <siteMapNode url="Main.aspx" title="$resources: local, menu_vehiclelist" roles="VEH_MODIFY,VEH_REMOVE,VEH_CREATE" />
            <siteMapNode url="~/VehicleCreation.aspx?Mode=insert" title="$resources: local, menu_createvehicle"  roles="VEH_CREATE" />
            <siteMapNode url="~/VehicleModification.aspx?Mode=edit" title="$resources: local, menu_modifyvehicle"  roles="VEH_MODIFY" />
            <siteMapNode url="~/VehicleModification.aspx?Mode=del" title="$resources: local, menu_removevehicle" roles="VEH_REMOVE"/>
          </siteMapNode>
     
          <siteMapNode title="$resources: local, menu_equipement" url="" description="" roles="EQUI_LIST,EQUI_ATTACH,EQUI_DETACH" >
            <siteMapNode title="$resources: local, menu_equipmentlist" url="~/EquipmentList.aspx" roles="EQUI_LIST" />
            <siteMapNode title="$resources: local, menu_attacheequipement" url="~/AttachEquipment.aspx" roles="EQUI_ATTACH"/>
            <siteMapNode title="$resources: local, menu_detachequipement" url="~/DetachEquipment.aspx" roles="EQUI_DETACH"/>
          </siteMapNode>
     
          <siteMapNode url="~/Parameters.aspx" title="$resources: local, menu_parameters" description="" roles="PARAM">
          </siteMapNode>
        </siteMapNode>
    </siteMap>
    Fix

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ce qui voudrait dire qu'on ne peut pas lier deux nodes au même role ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    ah j'en sais rien, je n'ai pas approfondi le sujet, moi je joue en groupe.
    Maintenant tu me dis que via ton exemple, tu sélectionnes tel groupe et cela affiche tout, cela me semble normal vu que les deux root node ont ce droit.

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Quand un rôle est acqui pour un noeud donné cela implique que tous les sous-noeuds sont eux-aussi affichés automatiquement ??? Si c'est ça la logique du truc m'échappe de plus en plus...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    je relance le sujet,
    je suis également de plus en plus perdu, je pensais comprendre mais là je ne vois plus rien du tout.
    Je n'utilise pas de fichier xml mais une base de données.
    J'ai donc une table: id - Title - Description - Url - Roles - Parent
    J'utilise également une class SqlSiteMapProvider (que maintenant je me doute de devoir modifier car apparement il y a des problèmes), qqun a t'il des explications à propos de ce SqlSiteMapProvider ?

    Qui doit avoir quel droit ?

    Fix

  7. #7
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    J'ai un peu du mal à piger tout ce que tu racontes mais je vais quand même essayer !

    J'ai quelques questions : as-tu surcharger la méthode IsAccessibleToUser dans ton SqlSiteMapProdiver ?

    Ma fonction IsAccessibleToUser ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
            {
                if (context != null && context.User != null && context.User.Identity.IsAuthenticated == true && node != null)
                {
                    if (node.Roles.Contains("*"))
                        return true;
     
                    string[] __roles = ((System.Web.Security.RolePrincipal)context.User).GetRoles();
                    foreach (string __role in __roles)
                        if (node.Roles == null || node.Roles.Contains(__role))
                            return true;
                }
                return false;
            }
    Cette fonction est utilisée pour vérifier que l'utilisateur possède bien les droits de visualisation dans le sitemap des différentes url !

    Je ne sais pas si je suis hors-sujet mais bon j'essaye avec ce que je comprends qui est : en gros tout le monde voit tout donc pour moi la vérification se fait pas !

    Bon courage

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    merci en fait, effectivement au début il me manquait cette méthode, maintenant je l'ai intégrée et j'ai un code différent du tien mais le principe est le même.

    Maintenant mon autre question:

    On est dans la base de donnée, dans notre table SiteMap.
    On a un Root Node (ParentNode) avec id = 1 et IdParent = NULL

    On a deux sous Parent (ChildOne et ChildTwo avec id = 10 et id = 20 leur idParent = 1)

    Chaque Child (one et two) ont trois pages => ChildOne_One, ChildOne_Two, ChildOne_Three. Id = 11,12 et 13. IdParent = 10.

    ChildOne a les roles des trois pages (One_One, One_Two et One_Three), chaque page a son propre droit.
    Donc si un utilisateur à au moins un des trois droits, il verra les trois liens.
    Ma question est comment éviter de voir pour l'utilisateur Y juste la page One_One et One_Two ?

    Est ce clair, j'ai pas envie de le représenter via un fichier SiteMap car y a pas vraiment la notion du RootNode. Si pas clair, je ferai une copie (screen shot d'une table bidon)

    Merci

    Fix

  9. #9
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Perso je comprends de ce tu racontes (mais c'est peut-être moi !)

    Déjà je reprends vite fait ton sitemap avec des rôles :

    On dit qu'on a 4 roles différents R1, R2, R3, R4 et je positionne les rôles sur les pages auxquelles ils ont droit

    RootNode (R1, R2, R3, R4)
    |_ ChildOne (R1, R2)
    | |_One_One (R1)
    | |_One_Two (R2)
    | |_One_Three (R3)
    |_ ChildTwo (R3,R4)
    |_Two_One (R3,R4)
    |_Two_Two (R3,R4)
    |_Two_Three (R3,R4)

    (Je sais c'est laid !)

    Donc on récapitule par page :
    RootNode sera vue par tous
    ChildOne que par R1 et R2
    One_One que par R1
    One_Two par R2
    etc...

    Les utilisateurs ne voient que les pages auxquelles ils ont droit !!!

    J'espère que cela t'éclaircit un peu !

    Un truc supplémentaire, je ne sais pas comment tu gères l'association des utilisateurs aux rôles mais il faut que tu définisses un RoleProvider et que tu associes par son biais les utilisateurs aux rôles auxquels il appartient en surchargeant notamment la procédure AddUsersToRoles définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    Edit : Oups... J'ai oublié l'indispensable : Bon courage

  10. #10
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ostenhard Voir le message
    Bonjour,

    J'ai un peu du mal à piger tout ce que tu racontes mais je vais quand même essayer !

    J'ai quelques questions : as-tu surcharger la méthode IsAccessibleToUser dans ton SqlSiteMapProdiver ?

    Ma fonction IsAccessibleToUser ressemble à ceci :
    [...]

    C'est très interessant, mais je n'ai pour ma part surchargé que le roleprovider défini 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="CustomRoleManager">
          <providers>
            <clear/>
            <add assembly="WebTool" namespace="WebTools" name="CustomRoleManager" 
                 type="WebTools.CustomRoleManager, WebTools" />
          </providers>
          </roleManager>
    et dans la méthod public override string[] GetRolesForUser(string username)
    je stocke les roles lus non plus en base, mais en variable de session (nettement mieux en terme de performance)

    Je comptais utiliser le fonctionnement du sitemap manager System.Web.XmlSiteMapProvider et de sa méthode IsAccessibleToUser par défaut (j'évite de ré-écrire le framework à moins d'en avoir vraiment besoin)... mais où peut-on trouver une description précise de ce fonctionnement ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    Je veux bien te croire
    Mais de ce que je comprends, c'est toi meme qui doit coder ce que tu veux que cela fasse.
    Mais je pense que j'y suis arrivé.
    En fait, j'ai du reprendre une partie d'application, la gestion des rôles - users est custom et donc ce n'est pas le Sql MemberShip provider avec toutes les class fournies d'office.

    Mais je pense avoir compris le principe avec les différentes méthodes à surcharger dans ta class Provider.

    Merci

    Fix

  12. #12
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Très content pour toi, mais moi je ne sais toujours pas pourquoi mon sitemap ne s'affiche pas comme il le devrait quand j'essaie de positionner des droits...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Points : 633
    Points
    633
    Par défaut
    Hum,

    Peut être as tu un SiteMapNode de trop (le global) ou s'il est nécessaire, peut être dois tu spécifier des droits pour ce premier SiteMapNode, comme celui là n'a rien, il n'affiche rien.

    Fix

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/02/2014, 13h03
  2. Comment activer la gestion des roles ASP.NET
    Par Afaf001 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 19/08/2013, 16h59
  3. Gestion des Roles en ASP.NET
    Par akli2008 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 08/04/2008, 14h23
  4. Réponses: 5
    Dernier message: 15/02/2008, 12h15
  5. [ASP.NET2.0 C#] Gestion des roles
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 09/08/2007, 11h48

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