Frage

Ich habe eine .NET-Webanwendung, die als Front-End-Site für Benutzer fungiert, und diese Anwendung nutzt eine separate SharePoint 2013-Anwendung, um den Benutzern Daten bereitzustellen.Eine der Aufgaben bestand darin, die Suche im Frontend zu implementieren, indem die SharePoint-eigene Suche genutzt wurde.Ich habe dieses Problem gelöst, indem ich meine Suchanfragen mit serverseitigem Code geschrieben habe.

Das Problem, auf das ich stoße, ist, dass die Suchergebnisse zwar korrekt zurückgegeben werden, diese jedoch nicht sicherheitsbezogen sind.Wenn ich beispielsweise 2 Dokumente habe, Dokument A und Dokument B, und ich einen Benutzer habe, der nur auf Dokument A zugreifen kann, gibt eine Suche durch den Benutzer immer noch beide Dokumente zurück.Nach einigen Recherchen stellte ich fest, dass dies an der Art und Weise liegen könnte, wie ich meine Suchanfrage erstelle, aber bisher konnte ich keine Lösung für das Problem finden.Hier ist der Code, der die Suchabfrage erstellt

// Get the result source and the search service proxy
string resultSourceName = ConfigurationManager.AppSettings["ResultSourceName"];

SearchServiceApplicationProxy searchProxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(spSite));
FederationManager federationManager = new FederationManager(searchProxy);
SearchObjectOwner searchOwner = new SearchObjectOwner(SearchObjectLevel.Ssa, spSite.RootWeb);
Microsoft.Office.Server.Search.Administration.Query.Source resultSource = federationManager.GetSourceByName(resultSourceName, searchOwner);

// Create a query object, set its result source and set the properties to return in the search results table
KeywordQuery query = new KeywordQuery(spSite);
query.SourceId = resultSource.Id;

Ich habe zwei Fragen:

  1. Was ist das Problem mit dem obigen Code, das dieses Sicherheitsproblem verursacht?
  2. Wenn es nicht der Code ist, was sind die anderen möglichen Ursachen für dieses Problem?
War es hilfreich?

Lösung 2

Ich habe endlich die Lösung für das Problem gefunden.Danke an Mike Lutge, der mich in die richtige Richtung gelenkt hat.

Das Lustige ist, dass obwohl spSite.UserToken und spSite.RootWeb.CurrentUser beide verweisen auf den Benutzer, der die Suchabfrage ausführt, die Suche scheint weiterhin im Kontext des Systemkontos ausgeführt zu werden.Ich glaube, dass entweder die KeywordQuery oder SearchExecutor klasse ignoriert den Benutzer in der spSite und führt es automatisch als Systemkonto aus.Um die Identität des Benutzers zu erzwingen, habe ich diesen Code zum Erstellen der SPSite verwendet:

System.Security.Principal.WindowsIdentity w = ((System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity);

using (WindowsImpersonationContext ctx = w.Impersonate())
using (SPSite spSite = new SPSite(ConfigurationManager.AppSettings["TheSPSite"]))
{
    response = searchRequest.searchFunction(searchRequest, spSite);
}

Auf diese Weise kann ich die Suchanfragen mit der richtigen Sicherheitsabstimmung ausführen.

Andere Tipps

Wenn der oben angegebene Code in einer SharePoint 2013-App ausgeführt hat, muss dann Ihre Suchabfrage als Benutzer ausgeführt werden, um Ihrem AppManifest.xml Folgendes hinzuzufügen:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top