SharePoint 2010 でのソーシャル タグの扱い

原文の記事の投稿日: 2011 年 9 月 29 日 (木曜日)

注意: この投稿の添付ファイルをダウンロードして、人が読める形式の Word 文書を入手してください。

最近、ソーシャル タグをファーム間で移行したいと考えている人から面白い依頼を受けました。これには出来合いの簡単な方法もあれば、いろいろ期待できそうだけれども今一歩という方法もあります。

テスト的に、"現実" の偽装は一切行わないで、ソーシャル タグだけを取得してみました。私のケースでは、うまくいきましたが、UPA 管理者としてログインした上でのテストなので、すべてのケースでうまくいくとは限りません。うまくいかない場合は、以下に述べる偽装テクニックを使うとよいでしょう。特定のユーザーに関するタグを取得するために、当該ユーザーの SPSite コンテキストを作成し、その上で、当該ユーザーのタグを取得するために必要なすべてのコンテキスト オブジェクトを作成するという方法を試しました。

SPUserToken sut = null;

//get the user token for user first so we can

//use that to get a site context as that user

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

{

   using (SPWeb rootWeb = userSite.RootWeb)

   {

       SPUser socialUser =

          rootWeb.EnsureUser(AccountTxt.Text);

       sut = socialUser.UserToken;

   }

}

                

//now get the site as that user – NOTE: these are

//all class scoped variables

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);

}

 

現行ユーザーとして作成されたコンテキストをすべて取得すると、その後、当該ユーザーのタグを簡単に取得できます。

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

 

TagLst.Items.Clear();

foreach (SocialTag tag in tags)

{

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

}

 

この部分はかなり単純ですが、別のユーザーのソーシャル タグを書くのはそれほど簡単でありませんでした。SocialTagManager には AddTag メソッドがあっても、GetTags メソッドのような UserProfile を含むオーバーロードが用意されていないからです。これは重大な欠陥であり、残念ながら、新しい SPSite コンストラクターに渡されたユーザーのコンテキストを使用しても解決できません。結果的に、これを行うには偽装を使用する必要があります。このケースでは、以下の投稿で説明した方法を再利用しました (https://blogs.msdn.com/b/sharepoint_jp/archive/2011/10/07/saml-sharepoint-wcf-windows-token-service-sql-server.aspx) ユーザーの偽装を行えるように CTWTS を構成しました (私のアプリケーションは私のユーザー コンテキストで動作していたからです)。具体的な方法は、ここに説明されています (https://msdn.microsoft.com/ja-jp/library/ee517258.aspx)。

この方法を念頭に置いて、最初に偽装を行いました。

//start the impersonation

//create the WindowsIdentity for impersonation

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);

}

 

//see if we were able to successfully login

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.");

}

 

偽装コード自体は特に複雑でありません。ユーザーの電子メール アドレスが必要なだけです (通常、ユーザーの UserProfile から取得でき、このコードでもそうしています)。CTWTS を各 SharePoint サーバーにインストールして実行しておく必要もあります。このコードは、そのオブジェクト モデルを使用するので、SharePoint サーバー上で実行する必要があります。これもそれほど面倒ではありません。

最後に、ユーザーの新しいタグを追加するためにもう一手間必要ですが、これも特に難しくありません。この部分のコードは次のようになります。

//this is the code that gets the SPSite, SPServiceContext, etc

GetServiceContext();

 

//work with the taxonomy classes so we

//can reuse any existing term, or create a

//new one if it doesn't exist

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];

 

//add the tag

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

 

ここでの処理は、追加するタグの分類ストア内で行われることと対応しています。つまり、タグがそこで見つかればそれを使用し、見つからなければ作成して用語ストアに追加します。その後、用語を追加して Url と関連付け、ユーザーのソーシャル タグに追加します。

このコードと方法は、全般的にはかなり単純です。ソーシャル タグの追加先のユーザーを指定できないことにどう対処するかがポイントになります。この部分は偽装コードと CTWTS で処理されるので、ユーザーごとにパスワードを用意する必要はありません。このプロジェクトのソース コードをこの投稿に添付しました。

 

これはローカライズされたブログ投稿です。原文の記事は、「Working with Social Tags in SharePoint 2010」をご覧ください。