Pregunta

Tengo una aplicación web .NET que actúa como un sitio front-end para los usuarios y esta aplicación aprovecha una aplicación SharePoint 2013 independiente para proporcionar datos a los usuarios.Una de las tareas fue implementar la búsqueda en el front-end aprovechando la propia búsqueda de SharePoint.Resolví este problema escribiendo mis consultas de búsqueda utilizando el código del lado del servidor.

El problema que encuentro es que, aunque los resultados de la búsqueda se devuelven correctamente, no hay ningún ajuste de seguridad en ellos.Por ejemplo, si tengo 2 documentos, el Documento A y el Documento B, y tengo un usuario que solo puede acceder al Documento A, una búsqueda realizada por el usuario aún arroja ambos documentos.Después de investigar un poco, pensé que esto podría deberse a la forma en que creo mi consulta de búsqueda, pero hasta ahora no he podido encontrar una solución al problema.Aquí está el código que crea la consulta de búsqueda.

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

Tengo dos preguntas:

  1. ¿Cuál es el problema con el código anterior que está causando este problema de recorte de seguridad?
  2. Si no es el código, ¿cuáles son las otras posibles causas de este problema?
¿Fue útil?

Solución 2

Finalmente encontré la solución al problema.Gracias a Mike Lutge por indicarme la dirección correcta.

Lo curioso es que aunque spSite.UserToken y spSite.RootWeb.CurrentUser ambos hacen referencia al usuario que realiza la consulta de búsqueda, la búsqueda todavía parece ejecutarse utilizando el contexto de la cuenta del sistema.Yo creo que el KeywordQuery o SearchExecutor La clase ignora al usuario en el spSite y lo ejecuta automáticamente como la cuenta del sistema.Para obligarlo a hacerse pasar por el usuario, utilicé este código para crear 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);
}

Esto me permite ejecutar las consultas de búsqueda con el recorte de seguridad correcto.

Otros consejos

Si el código que ha publicado anteriormente se está ejecutando en una aplicación de SharePoint 2013, para que su consulta de búsqueda se ejecute como usuario que deberá agregar lo siguiente a su AppManifest.xml:

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

Licenciado bajo: CC-BY-SA con atribución
scroll top