Article d’origine publié le jeudi 29 septembre 2011

REMARQUE :  veuillez télécharger la pièce jointe pour obtenir un document Word avec ce billet dans un format lisible.

Une personne m’a récemment demandé de l’aide en vue de migrer des liens de mise en réseau entre deux différentes batteries. Certaines fonctionnalités par défaut peuvent vous permettre d’effectuer cette opération, et d’autres d’aller un peu plus loin, mais pas suffisamment.

J’ai effectué quelques tests afin d’obtenir les liens de mise en réseau proprement dit sans aucune sorte de « réel » emprunt d’identité. Cela a fonctionné pour moi, mais je ne peux pas garantir que cela fonctionnera dans tous les cas, car j’étais connecté en tant qu’administrateur UPA. En cas d’échec, vous pourriez faire appel à la même technique d’emprunt d’identité que celle que je décris plus bas. Pour obtenir les liens pour un utilisateur, j’ai simplement essayé de créer un contexte SPSite en tant que cet utilisateur, puis de créer tous les objets de contexte nécessaires afin d’extraire les liens pour cet utilisateur, comme ceci :

SPUserToken sut = null;

//obtenir d’abord le jeton pour l’utilisateur de sorte

//que nous puissions l’utiliser pour obtenir un contexte de site en tant que cet utilisateur

using (SPSite userSite = new SPSite(UrlTxt.Text))

{

   using (SPWeb rootWeb = userSite.RootWeb)

   {

       SPUser socialUser =

          rootWeb.EnsureUser(AccountTxt.Text);

       sut = socialUser.UserToken;

   }

}

                

//maintenant, obtenir le site en tant que cet utilisateur – REMARQUE : toutes ces variables

//sont à étendue de classe

using (SPSite newSite = new SPSite(UrlTxt.Text, sut))

{

   sc = SPServiceContext.GetContext(newSite);

   stm = new SocialTagManager(sc);

   upm = new UserProfileManager(sc);

   up = upm.GetUserProfile(AccountTxt.Text);

}

 

Dès lors que j’ai les contextes qui ont été créés en tant qu’utilisateur actif, il est assez facile d’obtenir les liens de mise en réseau pour cet utilisateur :

SocialTag[] tags = stm.GetTags(up);

 

TagLst.Items.Clear();

foreach (SocialTag tag in tags)

{

   TagLst.Items.Add(tag.Term.Name + " - " + tag.Url.ToString());

}

 

Cette partie était assez simple. Ce n’était malheureusement pas le cas de l’écriture d’un lien de mise en réseau pour un autre utilisateur. Le SocialTagManager inclut une méthode AddTag, mais elle n’offre pas de surcharge qui comprend un UserProfile comme la méthode GetTags. C’est fâcheux, et malheureusement l’utilisation du contexte de l’utilisateur qui a été passé dans le nouveau constructeur SPSite n’aide aucunement. Il faut par conséquent faire appel à l’emprunt d’identité. Dans le cas présent, j’ai simplement réutilisé l’approche décrite dans ce billet – http://blogs.msdn.com/b/sharepoint_fr/archive/2011/10/07/utilisation-de-revendications-saml-de-sharepoint-de-wcf-du-service-d-233-mission-de-jetons-revendications-vers-windows-et-de-la-d-233-l-233-gation-contrainte-pour-acc-233-der-224-sql-server.aspx. J’ai configuré le CTWTS de façon à m’autoriser (puisque mon application s’exécutait dans mon contexte utilisateur) à emprunter l’identité d’autres utilisateurs. Les détails spécifiques relatifs à la marche à suivre sont décrits dans l’article suivant : http://msdn.microsoft.com/en-us/library/ee517258.aspx.

En gardant cette approche à l’esprit, voici donc comment j’ai tout d’abord effectué l’emprunt d’identité :

//démarrer l’emprunt d’identité

//créer le WindowsIdentity pour l’emprunt d’identité

WindowsIdentity wid = null;

 

try

{

   wid = S4UClient.UpnLogon(EmailTxt.Text);

}

catch (SecurityAccessDeniedException adEx)

{

   MessageBox.Show("Could not map the Email to " +

       "a valid windows identity: " + adEx.Message);

}

 

//voir si nous avons réussi à nous connecter

if (wid != null)

{

   using (WindowsImpersonationContext ctx = wid.Impersonate())

   {

       //code goes here to add a new tag

   }

}

else

{

   MessageBox.Show("Couldn’t impersonate user - can’t add tag.");

}

 

Le code d’emprunt d’identité proprement dit n’est pas si compliqué ; il suffit d’avoir l’adresse de messagerie de l’utilisateur (que l’on peut généralement obtenir à partir de son UserProfile, qui est extrait par ce code). Le CTWTS doit également être en cours d’exécution ; il est installé sur chaque serveur SharePoint et ce code doit s’exécuter sur un serveur SharePoint, car il utilise le modèle objet. Là encore, cela ne devrait pas constituer un obstacle majeur.

Pour finir, l’ajout du nouveau lien pour l’utilisateur nécessite de parcourir quelques boucles, mais rien d’insurmontable. Voici à quoi ressemble ce code :

//voici le code qui obtient le SPSite, SPServiceContext, etc

GetServiceContext();

 

//travailler avec les classes de taxonomie de sorte que

//nous puissions réutiliser tout terme existant, ou en créer

//une nouvelle s’il n’en existe aucune

TaxonomySession txs = stm.TaxonomySession;

TermStore ts = txs.DefaultKeywordsTermStore;

 

TermCollection terms =

   ts.KeywordsTermSet.GetTerms(TagTxt.Text,

   ts.DefaultLanguage, true);

 

Term t = null;

 

if (terms.Count == 0)

{

   t = ts.KeywordsTermSet.CreateTerm(TagTxt.Text,

       ts.DefaultLanguage);

       ts.CommitAll();

}

else

   t = terms[0];

 

//ajouter le lien

stm.AddTag(new Uri(TagUrlTxt.Text), t);

 

Ici, nous recherchons dans le magasin de taxonomies le lien qui est ajouté. Si nous le trouvons, nous utilisons ce terme ; dans le cas contraire, nous le créons et l’ajoutons au magasin de termes. Ensuite, nous ajoutons le terme et nous l’associons à une URL, qui est ensuite ajoutée aux liens de mise en réseau de cet utilisateur.

Globalement, le code et l’approche adoptée sont relativement simples. Le principal problème consiste à contourner l’incapacité à spécifier à quel utilisateur un lien de mise en réseau doit être ajouté. Le code d’emprunt d’identité et CTWTS prennent soin pour nous de cet aspect sans exiger le mot de passe de chaque utilisateur. Le code source de ce projet est joint à ce billet.

 

Ceci est une version localisée d’un article de blog. Vous trouverez la version originale à la page Working with Social Tags in SharePoint 2010