J'ai une partie Web qui accède au modèle d'objet SP, empaquetée dans un assembly qui est signé et déployé dans le GAC. Le fichier web.config est défini pour l'approbation "Complète", mais mon composant WebPart renvoie un SecurityException
. Les lignes incriminées de code:L'ensemble de confiance est défini sur Complet, mais la partie Web provoque toujours SecurityException
SPSecurity.RunWithElevatedPrivileges(new SPSecurity.CodeToRunElevated(() =>
{
foreach (SPGroup g in user.Groups)
{
identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\"));
}
}));
Il semble que l'exception est levée lorsque RunWithElevatedPrivileges
est appelé (autrement dit, mon délégué n'exécute pas du tout). Des idées? Je suis complètement désorienté à ce stade.
mise à jour: voici ce que le code ressemblait avant enveloppa dans la méthode RunWithElevatedPrivileges:
public MyWebPart()
{
context = new MyProject.Data.MyDataContext(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString);
SPUser user = SPContext.Current.Web.CurrentUser;
identity = String.Format("'{0}'", user.LoginName.ToLowerInvariant().Replace(@"\", @"\\"));
foreach (SPGroup g in user.Groups)
{
identity += String.Format(",'{0}'", g.Name.ToLowerInvariant().Replace(@"\", @"\\"));
}
identity = '[' + identity + ']';
}
Et l'exception:
System.Security.SecurityException occurred
Message="Request failed."
Source="Microsoft.SharePoint"
StackTrace:
at Microsoft.SharePoint.SPBaseCollection.System.Collections.IEnumerable.GetEnumerator()
at MyProject.MyWebPart..ctor()
InnerException:
Basé sur le point culminant fourni par l'assistant d'exception , il semble que la tentative d'accès de la propriété SPUser.Groups est le problème: user.Groups
. Ce qui me tracasse vraiment, c'est que ce code exact fonctionnait bien il y a deux jours, mais j'ai eu d'autres problèmes avec la ferme et j'ai dû le reconstruire. Après avoir récupéré tout le reste, je suis allé essayer d'ajouter cette partie web à une page et ce problème s'est manifesté. J'ai essayé d'encapsuler le code dans l'emballage RunWithElevatedPrivileges
pour voir si je pouvais isoler exactement le bit incriminé, mais il semble que tout ce qui touche le modèle d'objet SP provoque l'exception, y compris la méthode RunWithElevatedPrivileges
.
update2: Je ne sais toujours pas la véritable raison pour laquelle cela échouait, mais cela arrivait lorsque j'essayais d'ajouter le composant WebPart. Après avoir défini des points d'arrêt dans le débogueur, j'ai réalisé que le constructeur était appelé deux fois; la première fois, tout a fonctionné exactement comme prévu, mais la deuxième fois c'était quand l'exception était lancée. Je n'ai toujours aucune idée pourquoi. J'ai trouvé deux façons de contourner ceci: déplacer le code incriminé hors du constructeur vers un point ultérieur dans le cycle de vie du composant WebPart, ou commenter le code pour ajouter le composant WebPart, puis le décommenter et le redéployer.
Apparemment, la raison pour laquelle cela "fonctionnait il y a 3 jours" était parce que j'avais ajouté mon composant WebPart à une page il y a longtemps, puis ajouté le code ci-dessus au constructeur. Comme la partie Web a déjà été ajoutée, je n'ai jamais vu de problèmes. Plus tard, lorsque j'ai récemment dû reconstruire le site et ajouter de nouveau le composant WebPart à la page, ce problème s'est manifesté. Donc, techniquement, ça ne fonctionnait pas avant, je ne faisais pas ce qui le rendait mal.
Quoi qu'il en soit, comme je l'ai dit - je ne sais toujours pas la véritable cause de l'exception, donc les réponses dans ce sens sont toujours les bienvenues.
Le fait de retirer le code du constructeur d'un composant WebPart m'a aidé à résoudre un problème similaire. Merci d'avoir mis à jour la question. –
Quelqu'un sait pourquoi le déplacement de ce hors du contructor fonctionne? – xdhmoore