Corte de segurança dos resultados de pesquisa do SharePoint 2013
-
29-09-2020 - |
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:
- Qual é o problema com o código acima que está causando esse problema de corte de segurança?
- Se não for o código, quais são as outras possíveis causas desse problema?
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>