Verwenden gemeinschaftlicher Tags in SharePoint 2010
Veröffentlichung des Originalartikels: 29.09.2011
HINWEIS: Bitte laden Sie den Anhang herunter, um ein Word-Dokument mit diesem Beitrag in einem lesbaren Format zu erhalten.
Kürzlich hatte ich eine interessante Anfrage von einem Benutzer, der Hilfe beim Migrieren von gemeinschaftlichen Tags zwischen zwei unterschiedlichen Farmen wünschte. Hierfür gibt es einige gebrauchsfertige Lösungen, und manche Lösungen sind zwar spannend, aber nicht ausreichend.
Ich habe die Verwendung der gemeinschaftlichen Tags ohne jegliche Art von „echtem“ Identitätswechsel getestet. Bei mir hat es funktioniert, aber ich kann nicht garantieren, dass das in allen Fällen der Fall ist, da ich als UPA-Administrator angemeldet war. Sollte es nicht funktionieren, könnten Sie die von mir im Folgenden beschriebene Identitätswechseltechnik verwenden. Zum Abrufen der Tags für einen Benutzer habe ich einfach versucht, einen SPSite-Kontext unter dem Kontext dieses Benutzers zu erstellen. Anschließend habe ich alle Kontextobjekte erstellt, die zum Abrufen von Tags für diesen Benutzer erforderlich sind. Dabei bin ich folgendermaßen vorgegangen:
SPUserToken sut = null;
//Abrufen des Benutzertokens für den ersten Benutzer, damit hiermit ein
//Websitekontext unter dem Kontext dieses Benutzers abgerufen werden kann
using (SPSite userSite = new SPSite(UrlTxt.Text))
{
using (SPWeb rootWeb = userSite.RootWeb)
{
{
rootWeb.EnsureUser(AccountTxt.Text);
sut = socialUser.UserToken;
}
}
//nun Abrufen der Website unter dem Kontext dieses Benutzers – HINWEIS: Hierbei
//handelt es sich um Klassenvariablen
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);
}
Nachdem ich nun über die Kontextelemente verfüge, die unter dem Kontext des aktuellen Benutzers erstellt wurden, ist das Abrufen der Tags für diesen Benutzer ziemlich einfach:
SocialTag[] tags = stm.GetTags(up);
TagLst.Items.Clear();
foreach (SocialTag tag in tags)
{
TagLst.Items.Add(tag.Term.Name + " - " + tag.Url.ToString());
}
Dieser Teil war ziemlich einfach. Das Erstellen eines gemeinschaftlichen Tags für einen anderen Benutzer war leider nicht annähernd so einfach. SocialTagManager weist eine AddTag-Methode auf, ermöglicht jedoch kein Überladen, was ein UserProfile-Element beinhaltet, wie dies bei der GetTags-Methode der Fall ist. Dies ist eine grobe Übersicht, und leider hilft die Verwendung des Kontexts des Benutzers, der an den neuen SPSite-Konstruktor übergeben wurde, nicht weiter. Deshalb müssen Sie hierfür den Identitätswechsel verwenden. In diesem Fall habe ich einfach die im folgenden Beitrag verwendete Vorgehensweise wiederverwendet: https://blogs.msdn.com/b/sharepoint_de/archive/2011/10/07/verwenden-von-saml-anspr-252-chen-sharepoint-wcf-des-forderungen-an-den-windows-tokendiensts-und-der-eingeschr-228-nkten-delegierung-f-252-r-den-zugriff-auf-sql-server.aspxFür CTWTS habe ich konfiguriert, dass ich (da meine Anwendung unter meinem Benutzerkontext ausgeführt wurde) für Benutzer einen Identitätswechsel vornehmen darf. Ausführliche Informationen hierzu finden Sie im folgenden Artikel: https://msdn.microsoft.com/en-us/library/ee517258.aspx.
Mithilfe dieser Vorgehensweise habe ich zunächst den Identitätswechsel vorgenommen:
//Starten des Identitätswechsel
//Erstellen des WindowsIdentity-Elements für den Identitätswechsel
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);
}
//Feststellen, ob wir uns erfolgreich anmelden konnten
if (wid != null)
{
using (WindowsImpersonationContext ctx = wid.Impersonate())
{
//hier Einfügen von Code zum Hinzufügen eines neuen Tags
}
}
else
{
MessageBox.Show("Couldn't impersonate user - can't add tag.");
}
Der Code für den Identitätswechsel selbst ist nicht besonders kompliziert. Sie benötigen lediglich die E-Mail-Adresse des Benutzers (was wahrscheinlich über das UserProfile-Element möglich ist, das mit diesem Code abgerufen wird). Außerdem wird CTWTS auf jedem SharePoint-Server installiert und muss ausgeführt werden. Dieser Code muss auf einem SharePoint-Server ausgeführt werden, da er das Objektmodell verwendet. Dies sollte wiederum kein großes Hindernis darstellen.
Schließlich erfordert das Hinzufügen des neuen Tags für den Benutzer ein paar Sprünge, was jedoch nicht allzu kompliziert ist. Der Code hierfür sieht folgendermaßen aus:
//mit diesem Code wird SPSite, SPServiceContext usw. abgerufen
GetServiceContext();
//Wir verwenden die Taxonomieklassen, sodass wir
//vorhandene Ausdrücke wiederverwenden oder ggf. einen
//neuen Ausdruck erstellen können
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];
//Hinzufügen des Tags
stm.AddTag(new Uri(TagUrlTxt.Text), t);
Wir haben also im Taxonomiespeicher nach dem Tag gesucht, das hinzugefügt wird. Wenn wir das Tag hier finden, verwenden wir diesen Ausdruck. Andernfalls erstellen wir das Tag und fügen es anschließend dem Terminologiespeicher hinzu. Danach fügen wir den Ausdruck hinzu und ordnen ihn einer URL zu. Der Ausdruck wird dann den gemeinschaftlichen Tags dieses Benutzers hinzugefügt.
Insgesamt sind der Code und die Vorgehensweise ziemlich einfach. Das Hauptproblem in diesem Zusammenhang ist, wie man umgehen kann, dass es nicht möglich ist anzugeben, welchem Benutzer ein gemeinschaftliches Tag hinzugefügt werden soll. Der Code für den Identitätswechsel und CTWTS erledigen dies für uns, ohne dass das Kennwort für jeden Benutzer erforderlich ist. Der Quellcode für dieses Projekt ist an diesen Beitrag angefügt.
Es handelt sich hierbei um einen übersetzten Blogbeitrag. Sie finden den Originalartikel unter Working with Social Tags in SharePoint 2010