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」をご覧ください。