Question

J'ai une application Web .NET qui fait office de site frontal pour les utilisateurs, et cette application exploite une application SharePoint 2013 distincte pour fournir des données aux utilisateurs.L'une des tâches consistait à implémenter la recherche sur le front-end en tirant parti de la propre recherche de SharePoint.J'ai résolu ce problème en écrivant mes requêtes de recherche à l'aide du code côté serveur.

Le problème que je rencontre est que, bien que les résultats de la recherche soient renvoyés correctement, ils ne sont soumis à aucun contrôle de sécurité.Par exemple, si j'ai 2 documents, le document A et le document B, et que j'ai un utilisateur qui ne peut accéder qu'au document A, une recherche effectuée par l'utilisateur renvoie toujours les deux documents.Après quelques recherches, j'ai pensé que cela pouvait être dû à la façon dont je crée ma requête de recherche, mais jusqu'à présent, je n'ai pas réussi à trouver de solution au problème.Voici le code qui crée la requête de recherche

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

J'ai deux questions:

  1. Quel est le problème avec le code ci-dessus qui est à l'origine de ce problème de réduction de sécurité ?
  2. Si ce n’est pas le code, quelles sont les autres causes possibles de ce problème ?
Était-ce utile?

La solution 2

J'ai enfin trouvé la solution au problème.Merci à Mike Lutge de m'avoir orienté dans la bonne direction.

Ce qui est drôle, c'est que même si spSite.UserToken et spSite.RootWeb.CurrentUser les deux font référence à l'utilisateur effectuant la requête de recherche, la recherche semble toujours être exécutée en utilisant le contexte du compte système.Je crois que soit le KeywordQuery ou SearchExecutor la classe ignore l'utilisateur dans le spSite et l'exécute automatiquement en tant que compte système.Pour le forcer à usurper l'identité de l'utilisateur, j'ai utilisé ce code pour créer le 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);
}

Cela me permet d'exécuter les requêtes de recherche avec le réglage de sécurité correct.

Autres conseils

Si le code que vous avez affiché ci-dessus est en cours d'exécution dans une application SharePoint 2013, puis pour que votre requête de recherche soit exécutée en tant qu'utilisateur, vous devez ajouter les éléments suivants à votre AppManifest.xml:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top