none
Probleme de sécurité / RunWithElevatedPrivileges RRS feed

  • Question

  • Bonjour,

    J'ais un tres gros probleme.

    J'ai développé un web part dans lequel j'éxécute des requete CAML a la suite de saisie utilisateur pour filtrer une liste.
    Mais à part pour l'administrateur, j'ai des problemes de sécurité.. L'utilisateur n'a pas d'acces lorsque je tente quelque chose.
    J'ai pourtant entouré mes méthodes par des

    "RunWithElevatedPrivileges" mais aucun résultat..

    Merci de me donner un coup de pouce, c'est assez urgent.
    Développeur en herbe..
    mercredi 6 janvier 2010 15:49

Réponses

  • D'accord, merci bien de toutes vos réponses, elles m'ont aidées.
    J'ai résolu mon problème en faisant une redirection sur la page (ce qui l'actualise) et en passant les valeurs des textbox en parametres.
    Développeur en herbe..
    • Marqué comme réponse HeB91 lundi 11 janvier 2010 15:01
    lundi 11 janvier 2010 15:01

Toutes les réponses

  • Peut-être que ce lien pourra t'aider à résoudre le "RunWithElevatedPrivileges" : http://daniellarson.spaces.live.com/blog/cns!D3543C5837291E93!927.entry?sa=486500840
    • Marqué comme réponse HeB91 jeudi 7 janvier 2010 12:51
    • Non marqué comme réponse HeB91 jeudi 7 janvier 2010 12:53
    jeudi 7 janvier 2010 09:47
  • Bonjour, merci pour ta réponse, cela m'a aidé à régler ce probleme de sécurité, par contre. du coup j'ai un autre problème.. je pense de rafraichissement de la page car il faut que je clique 2 fois sur le bouton pour que le traitement se fasse correctement, la premiere fois, rien ne se passe.. :/
    Développeur en herbe..
    jeudi 7 janvier 2010 12:53
  • est-ce parce que je n'utilise pas cette partie :
     SPListItem record = theList.Items.Add();
          record["User"] = user;
          record.Update(); // uses SHAREPOINT\system
    

    ?

    voici mon code :

    // Execution de la requete de remise à zero lors du clic && clear les textbox
            public void B_RAZ_OnClick(object sender, EventArgs e)
            {
    
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    // Gets a new security context using SHAREPOINT\system
                    using (SPSite site = new SPSite(this.Page.Request.Url.ToString()))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            // Récupération du site courant et de la liste DE
                            //SPWeb web = SPContext.Current.Web;
                            // Obligé d'autorisé des requetes sans sécurité pour éxécuter la query
                            web.AllowUnsafeUpdates = true;
    
                            // Récupération ddu context nécéssaire,liste,vue en cours..
                            SPList list = web.Lists["DE"];
                            SPView vue_filtrer = list.Views["réduit"];
                            //SPViewContext vue_context = SPContext.Current.ViewContext;
                            //SPView vue_filtrer = vue_context.View;
    
                            string query = "<OrderBy><FieldRef Name='ID' Ascending='False' /></OrderBy>";
                            
                            vue_filtrer.Query = query;
                            vue_filtrer.Update();
                          
                            // clear les champs textbox
                            for (int i = 0; i < cols.Length; i++)
                            {
                                T["TB_" + cols[i]].Text = "";
                            }
                        }
                    }
                });
            }

    Développeur en herbe..
    jeudi 7 janvier 2010 13:04
  • Salut,
    à la place d'utiliser RunWithElevatedPrivileges, j'utilise SPUser.UserToken lors de l'initialisation de l'objet SPSite. J'ai résolu mes problèmes d'accès grace à ça. Voici un exemple pour lancer ta requete CAML. Il te faut simplement définir un utilisateur dans ton code qui aura accès aux ressources en question (DOMAIN\login dans le groupe propriétaires ou membres).

    //récupération de l'utilisateur autorisé, 
    //ne fonctionne pas en accès anonyme, l'utilisateur en cours doit pouvoir lister les autres utilisateurs
    //éventuellement utiliser RunWithElevatedPrivileges...
    private SPUser SPSuperUser = null; using (SPSite site = new SPSite(SPContext.Current.Web.Url)) { using (SPWeb web = site.RootWeb) { SPSuperUser = web.AllUsers[@"DOMAIN\login"]; } }
    Puis pour l'exécution:
    using (SPSite site = new SPSite(SPContext.Current.Web.Url, SPSuperUser.UserToken))
    { //exécution d'une requête avec les droit de SPSuperUser
    }
    Damien
    • Modifié Damien B. _ vendredi 8 janvier 2010 11:53
    • Proposé comme réponse Damien B. _ jeudi 14 janvier 2010 14:24
    jeudi 7 janvier 2010 14:55
  • Bonjour,

    je pense pas que ce soit la meilleure facon de faire ca... Comment veux tu déployer un machin comme ça ? Avec des login hard codé, c'est vraiment pas une bonne idée... L'utilisation de RunWithElevatedPrivileges est bien meilleure.

    HeB91, j'ai regardé un peu ton code et... J'en comprend pas l'interet de ce bout de code... Bref, une simple question utilises-tu de l'AJAX ?
    http://www.areaprog.com
    jeudi 7 janvier 2010 15:24
  • SPUser.UserToken est l'aproche que je trouve la plus stable, il faut savoir que lors de l'exécution de RunWithElevatedPrivileges l'identité du thread change, cette solution est préconisé lorsque le code accède aux données d'un pool d'application différent mais surement pas lors d'une requête sur le même site.
    Si le fait du login en dur dans le code ne te convient pas, tu peux coder quelques lignes de plus pour récupérer une liste propriété (cachée) qui contiendrait le "DOMAIN\login".

    Dans tous les cas si vous utilisez RunWithElevatedPrivileges n'oubliez pas de faire un dispose des objets SPWeb ou SPSite !

    Damien
    jeudi 7 janvier 2010 16:21
  • Bonjour, merci de vos réponses

    désolé damien mais je ne vais pas m'aventurer dans ta méthode car le temps presse et j'y suis presque.. merci quand meme je la garde sous le bras!

    Ce bout de code sert juste à remettre en place tout les éléments dans une liste qui a été filtré lors de l'appui du bouton..

    Le probleme est qu'il faut appuyer 2 fois sur le bouton pour que ça marche..en fait j'ai rajouté une actualisation de la page apres le views.update et du coup ca le fais bien lors du premier clic. Mais un nouveau probleme survient.. et oui. :(

    Probleme a part avec ce code : des textbox et un bouton "filtrer" permettent d'executer des requetes CAML sur la liste en prenant en compte les saisie comme parametre pour filtrer la liste.. mais une fois filtrer et la page rechargé, les saisie utilisateur ont disparues des textbox..ce que je ne souhaite pas.

    J'ai donc opté pour les transmettre en parametre dans l'url mais quand j'essai de les récupérer avec Request, j'ai 60 parametres... bref je sombre de plus en plus ! si vous avez des solutions pour soit régler mon premier probleme sans rafraichir la page ou bien en ce qui concerne le passage des parametres dans l'url pour préremplir la textbox.. merci
    Développeur en herbe..
    jeudi 7 janvier 2010 16:22
  • Est-ce que tes objets sont chargées en données avant le rendering ?

    Un post qui doit pouvoir t'aider à voir quand charger les données et quand le rendering est fait :
    http://platinumdogs.wordpress.com/2008/10/14/sharepoint-webpart-lifecycle-events/

    > Faire le chargement des données dans le PreRender...

    jeudi 7 janvier 2010 16:54
  • Bonjour,

    > Damien Blondel

    Pourquoi faut-il faire un Dispose de ces objets ?

    > Charles Badjaksezian

    faire le chargement des données dans le PreRender ,

    donc la création de mes controls dynamiquement doivent etre fait dedans? pourquoi?


    Développeur en herbe..
    vendredi 8 janvier 2010 10:58
  • Pourquoi faut-il faire un Dispose de ces objets (SPSite et SPWeb) ?

    Voir ce très bon article: http://msdn.microsoft.com/en-us/library/aa973248.aspx (en anglais).
    En bref c'est pour éviter les problèmes de performance, de sécurité surtout avec RunWithElevatedPrivileges, et pour réduire les ressources système nécessaires.
    Merci d'ouvrir un nouveau post pour plus de détails.

    Damien
    vendredi 8 janvier 2010 11:44
  • D'accord, merci bien de toutes vos réponses, elles m'ont aidées.
    J'ai résolu mon problème en faisant une redirection sur la page (ce qui l'actualise) et en passant les valeurs des textbox en parametres.
    Développeur en herbe..
    • Marqué comme réponse HeB91 lundi 11 janvier 2010 15:01
    lundi 11 janvier 2010 15:01
  • Ta réponse ne me semble pas très pertinente... as-tu vérifié le postback lorsque tu traite les données saisies ?
    if (!Page.IsPostBack)
    {
         //premier affichage de la page 
    }
    else
    {
         //traitement des données de saisie envoyées
    }
    lundi 11 janvier 2010 17:59
  • oui, et je rajoute que je prends en compte pas mal de données finalement, non seulement les valeurs des textbox à remettre mais aussi si un filtre du type FilterField ou un tri sortby sont présent.

    Ainsi, je manipule l'url pour :
    - actualiser
    - contrôler les filtres appliqués sur ma liste

    j'ai du faire comme cela lorsque j'ais intégré la notion de droits utilisateurs certaines partie de mon code ne fonctionnait plus..



    Développeur en herbe..
    mardi 12 janvier 2010 07:38