none
[WSS3] Barre de navigation supérieure et Impersonation RRS feed

  • Question

  • Bonjour.

    Je viens de développer un programme qui customise la barre de navigation supérieure de sorte que toutes les collections aient un point d'entrée commun. Cette barre prend en compte la sécurité çàd que je ne vois que ce à quoi j'ai droit. Aussi, il y a affichage de l'ensemble des sites de chaque collection çàd que chacun de ces sites apparait dans cette barre.

    Le souci est que dès qu'une personne a seulement un droit de lecture sur une de ces collections j'ai un joli "Accès refusé" qui s'affiche et rien n'est accessible.

    Le message d'erreur est "UnauthorizedAccessException" et il se produit au moment où le lecture tente d'exécuter le code suivant :

    for (int j = 0; j < currColl.RootWeb.Webs.Count; j++)


    ça semble donc être un problème de droit d'accès et il faut passer par l'impersonation!

    Sauf que voilà, j'ai du mal avec

    SPSecurity.RunWithElevatedPrivileges

    Car, en fonction de l'endroit où je la position dans le code, j'ai soit accès refusé à tout le monde y compris les administrateurs soit affichage, pour les lecteurs, des sous sites auxquels ils n'ont pas accès!

    Pour le

    SPUserToken

    , j'ai du mal à comprendre son fonctionnement.

    Après une journée passée à chercher une solution, je me retourne vers vous afin d'avoir votre avis et s'il y a une solution "plus simple" pour aboutir mon code s'il vous plaît ?

    En vous remerciant par avance.

    vendredi 22 juillet 2011 08:50

Toutes les réponses

  • Bonjour,

    Le code que vous mentionnez peut provoquer cette exception pour plusieurs raisons :

    • L'utilisateur n'a pas accès à la collection de sites (à priori ce n'est pas ça puisque vous indiquez que les utilisateurs ont accès en lecture, au moins)
    • L'utilisateur n'a pas accès à un des sites de la collection (RootWeb.Webs)

    Si vous souhaitez utiliser SPSecurity.RunWithElevatedPrivileges, il vous faut recréer une instance de la collection de sites :

    // L'objet "site" est la collection de sites ciblée
    
    SPSecurity.RunWithElevatedPrivileges(delegate() 
    {
      using (SPSite elevatedSite = new SPSite(site.ID)) 
      {
        for (int j = 0; j < elevatedSite.RootWeb.Webs.Count; j++)
        {
           // Ajoutez votre code ici
        }
      }
    });
    


    Lorsque vous utilisez RunWithElevatedPrivileges, les instances déjà créées ne peuvent pas utiliser l'élévation de privilèges.

    C'est la raison pour laquelle un objet SPSite est recréé à l'intérieur du bloc SPSecurity.RunWithElevatedPrivileges.

     

    Pour information, Sahil Malik a publié un billet de blog pour présenter une navigation présentant toutes les collections de sites, et un second billet de blog pour présenter comment filtrer les liens de navigation selon l'utilisateur qui se connecte.

    Je vous recommande de lire ces billets :

     


    Sébastien PICAMELOT - http://blogs.developpeur.org/gribouillon/

    vendredi 22 juillet 2011 14:40