Domanda

Ho un'applicazione Web .NET che funge da sito di front-end per gli utenti e questa applicazione sfrutta un'applicazione separata SharePoint 2013 per servire i dati agli utenti. Uno dei compiti era implementare la ricerca sul front-end superando la ricerca personale di SharePoint. Ho risolto questo problema scrivendo le mie query di ricerca utilizzando il codice lato server.

Il problema che sto incontrando è che sebbene i risultati della ricerca vengano restituiti correttamente, non ci sono limiti di sicurezza su di essi. Ad esempio, se ho 2 documenti, documentare A e Document B, e ho un utente che può accedere solo al documento A, una ricerca da parte dell'utente restituisce ancora entrambi i documenti. Dopo alcune ricerche, ho capito che questo potrebbe essere dovuto al modo in cui creo la mia query di ricerca, ma finora non sono riuscito a trovare una soluzione al problema. Ecco il codice che crea la query di ricerca

// 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;
.

Ho due domande:

    .
  1. Qual è il problema con il codice sopra riportato che causa questo problema di rifinitura della sicurezza?
  2. Se non è il codice, quali sono le altre possibili cause di questo problema?
È stato utile?

Soluzione 2

Alla fine ho trovato la soluzione al problema.Grazie a Mike Lutge per indicarmi nella giusta direzione.

La cosa divertente è che, sebbene spSite.UserToken e spSite.RootWeb.CurrentUser sia referenziale, l'utente esegue la query di ricerca, la ricerca sembra essere eseguita ancora utilizzando il contesto dell'account di sistema.Credo che la classe KeywordQuery o SearchExecutor ignorasse l'utente nel spSite e lo esegue automaticamente come account di sistema.Per costringerlo a impersonare l'utente, ho usato questo codice per creare lo spSite:

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

Questo mi consente di eseguire le query di ricerca con il corretto ritaglio di sicurezza su di loro.

Altri suggerimenti

Se il codice che hai pubblicato sopra è in esecuzione in un'app di SharePoint 2013, quindi in modo che la tua query di ricerca sia eseguita come utente dovrai aggiungere quanto segue al tuo appManifest.xml:

<AppPermissionRequests>
    <AppPermissionRequest Scope="http://sharepoint/search" Right="QueryAsUserIgnoreAppPrincipal" />
</AppPermissionRequests>
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top