Pergunta

Eu tenho um aplicativo Web .NET que atua como um site front-end para os usuários, e esse aplicativo aproveita um aplicativo SharePoint 2013 separado para fornecer dados aos usuários.Uma das tarefas era implementar a Pesquisa no front-end, aproveitando a pesquisa do próprio SharePoint.Resolvi esse problema escrevendo minhas consultas de pesquisa usando o código do servidor.

O problema que estou encontrando é que, embora os resultados da pesquisa sejam retornados corretamente, não há nenhum corte de segurança neles.Por exemplo, se eu tiver 2 documentos, Documento A e Documento B, e tiver um usuário que só pode acessar o Documento A, uma pesquisa feita pelo usuário ainda retornará os dois documentos.Depois de alguma pesquisa, percebi que isso poderia ser devido à maneira como crio minha consulta de pesquisa, mas até agora não consegui encontrar uma solução para o problema.Aqui está o código que cria a consulta de pesquisa

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

Eu tenho duas perguntas:

  1. Qual é o problema com o código acima que está causando esse problema de corte de segurança?
  2. Se não for o código, quais são as outras possíveis causas desse problema?
Foi útil?

Solução 2

Finalmente encontrei a solução para o problema.Obrigado a Mike Lutge por me indicar a direção certa.

O engraçado é que embora spSite.UserToken e spSite.RootWeb.CurrentUser ambos fazem referência ao usuário que realiza a consulta de pesquisa, a pesquisa ainda parece ser executada usando o contexto da conta do sistema.Acredito que ou o KeywordQuery ou SearchExecutor classe ignora o usuário no spSite e o executa automaticamente como conta do sistema.Para forçá-lo a se passar pelo usuário, usei este código para criar o 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);
}

Isso me permite executar as consultas de pesquisa com o ajuste de segurança correto.

Outras dicas

Se o código que você postou acima estiver sendo executado em um aplicativo do SharePoint 2013, para que sua consulta de pesquisa seja executada como usuário, você precisará adicionar o seguinte ao seu AppManifest.xml:

<AppPermissionRequests>
    <AppPermissionRequest Scope="http://sharepoint/search" Right="QueryAsUserIgnoreAppPrincipal" />
</AppPermissionRequests>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top