2012-10-08 2 views
0

J'essaie de corriger un code (que je n'ai pas écrit) qui insère un élément dans une liste SharePoint. Le problème est que le code fonctionne pour les utilisateurs anonymes, mais si l'utilisateur est connecté via l'authentification par formulaires ASP.NET, il obtient une exception UnauthorizedAccessException lors de l'appel de la méthode Update de SPListItem. Quand cela fonctionne, en tant qu'utilisateur anonyme, je peux voir le SPUser de SPWeb SPListItem est le compte système SharePoint. Mais lorsque l'utilisateur est connecté avec l'authentification par formulaires, le SPUser est null. Quelqu'un peut-il expliquer ce comportement et comment le réparer? À l'origine, seul le bloc de code supérieur se trouvait dans le délégué RunWithElevatedPrivileges, mais j'ai essayé de tout déplacer à l'intérieur. Je vais insérer quelques blocs à l'aide une fois que je le faire fonctionner:SPListItem.Update throws UnauthorizedAccessException pour l'utilisateur Forms authentifié

SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      rootWeb = SPContext.Current.Site.RootWeb; 
      rootWeb.AllowUnsafeUpdates = true; 
      currentWeb = SPContext.Current.Web; 
      currentWeb.AllowUnsafeUpdates = true; 

     try 
     { 
      // Get site information 
      SPList franDir = rootWeb.GetList("/Lists/Directory"); 
      SPQuery query = new SPQuery(); 
      query.Query = "<Where><Eq><FieldRef Name='Subsite'/><Value Type='Text'>" + currentWeb.Name + 
       "</Value></Eq></Where>"; 

      SPListItemCollection items = franDir.GetItems(query); 

      SPList l = rootWeb.GetList("/Lists/Request"); 

      SPListItem li = l.Items.Add(); 
      li["Location"] = siteName; 
      //...set more fields 


      li.Update(); 

     } 
     catch (Exception ex) 
     { 
      rootWeb.Dispose(); 
      logger.ErrorException("An error occured adding item", ex); 
      throw ex; 
     } 

     rootWeb.Dispose(); 
     }); 
+1

C'est une manière inutile d'utiliser 'RunWithElevatedPrivileges' - vous devez créer de nouveaux objets SPSite/SPWeb à l'intérieur du même siteId/webId que celui-ci pour qu'il fonctionne réellement avec des privilèges élevés. Corrigez cela et voyez si vous avez toujours un problème. –

Répondre

0

Merci à @AlexeiLevenkov je vois que cela ne fonctionne pas parce que je suis en utilisant une instance existante des objets SP qui ont été créés à l'aide par défaut privilèges Pour prouver que le code ne fait rien, lors de l'exécution en tant qu'utilisateur anonyme, le code réussit même sans l'appel RunWithElevatedPrivileges. J'ai fait ce changement et il s'en est occupé.

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    rootWeb = new SPSite(SPContext.Current.Site.ID).RootWeb; 

Merci beaucoup!

Questions connexes