SharePoint 2013 Risultati della ricerca Risultati della sicurezza
-
29-09-2020 - |
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:
- .
- Qual è il problema con il codice sopra riportato che causa questo problema di rifinitura della sicurezza?
- Se non è il codice, quali sono le altre possibili cause di questo problema?
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>
.