Usar um filtro de segurança personalizado nos resultados de pesquisa do SharePoint Server
Essa instruções orienta você pelas etapas para implementar, criar, implantar e registrar um aparador de segurança personalizado para Pesquisa no SharePoint usando o Microsoft Visual Studio 2010.
Pesquisa no SharePoint executa o corte de segurança em tempo de consulta dos resultados da pesquisa. No entanto, pode haver cenários nos quais você deseja realizar a filtragem de segurança personalizada. Pesquisa no SharePoint fornece suporte para esses cenários por meio do Microsoft.Office.Server.Pesquisa. Query.ISecurityTrimmerPre , Microsoft.Office.Server.Pesquisa. Interfaces Query.ISecurityTrimmerPost e ISecurityTrimmer2 (preteridas) no Microsoft.Office.Server.Pesquisa. Namespace de consulta.
Existem dois tipos de filtragem de segurança personalizada: filtragem anteriores e posteriores à filtragem. Pré-filtragem de se refere a avaliação de pré-consulta onde a consulta será reconfigurada para adicionar informações de segurança antes que a consulta é correspondida ao índice de pesquisa. Pós-filtragem de se refere a avaliação da consulta posterior ao onde os resultados da pesquisa são removidos antes que eles são retornados para o usuário.Recomendamos o uso de filtragem de pré-lançamento para desempenho e correção geral; pós-filtragem de impede que o vazamento de informações para dados de refinador e instâncias de contagem de ocorrências. O processo de registro de cortadores de segurança permite que você especifique as propriedades de configuração para o Cortador de segurança personalizado.
Filtragem de segurança personalizada no Pesquisa no SharePoint 2013 consiste em duas interfaces que podem ser usados para realizar a filtragem de pré-lançamento ou pós-filtragem dos resultados da pesquisa. Este tutorial enfoca ambas as interfaces, que descreve as etapas necessárias para criar e registrar seus próprio de segurança conectáveis.
Visão Geral
O corte de segurança personalizado em Pesquisa no SharePoint consiste em duas interfaces que podem ser usadas para realizar o pré-corte ou pós-corte dos resultados da pesquisa. Essa forma de se concentrar em ambas as interfaces, descrevendo as etapas necessárias para criar e registrar seus próprios aparadores de segurança.
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte instalado em seu ambiente de desenvolvimento:
- Pesquisa no Microsoft SharePoint
- Microsoft Visual Studio 2010 ou semelhante Microsoft .NET Framework - ferramenta de desenvolvimento compatível
Configurar um projeto de cortadores de segurança personalizada
Nesta etapa, você irá criar o projeto de cortadores de segurança personalizado e adicione as referências necessárias ao projeto.
Para criar o projeto para um cortador de segurança personalizado
- Abra Visual Studio e escolha arquivo, novoprojeto.
- Em tipos de projeto, em c#, escolha SharePoint.
- Em modelos, escolha o Projeto vazio do SharePoint. No campo nome, digite CustomSecurityTrimmerSample e escolha o botão OK.
- No Assistente de personalização do SharePoint, selecione implantar como uma solução de farm e, em seguida, escolha Concluir.
Para adicionar referências para o projeto de cortadores de segurança personalizada
No menu Projeto, escolha Adicionar Referência.
Na guia .NET, escolha as referências com os seguintes nomes de componente e escolha o botão OK:
- Componente do Microsoft Search
Você deverá ver duas entradas na guia .NET com o nome do componente componente de pesquisa da Microsoft. Selecione a entrada em que a coluna Caminho está \ISAPI\Microsoft.Office.Server.Search.dll. Se essa entrada estiver ausente da guia .NET na caixa de diálogo Adicionar referências, você deve adicionar a referência do guia Procurar usando o caminho para o Microsoft.Office.Server.Search.dll.
- Microsoft.IdentityModel
Se o Microsoft. IdentityModel não estiver listado na guia .NET, você deve adicionar a referência para a Microsoft.IdentityModel.dll na guia Procurar, usando o seguinte caminho:
%ProgramFiles%\\Reference Assemblies\\Microsoft\\Windows Identity Foundation\\v4.0.
Criar um filtro de segurança personalizado prévia
Para criar o arquivo de classe para o Cortador de segurança prévia
- No menu projeto, escolha Adicionar Novo Item.
- Em Visual c# itensModelos instalados, clique em código e escolha classe.
- Digite CustomSecurityPreTrimmer.cs e escolha Adicionar.
Escrever o código de pré-lançamento Cortador de segurança personalizada
O Cortador de segurança personalizado deve implementar a interface ISecurityTrimmerPre. O exemplo de código a seguir é uma implementação básica desta interface.
Para modificar o código de padrão no CustomSecurityPreTrimmer
Adicione as seguintes diretivas de using no início da classe.
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Security.Principal; using Microsoft.IdentityModel.Claims; using Microsoft.Office.Server.Search.Query; using Microsoft.Office.Server.Search.Administration;
Especifica que a classe CustomSecurityPreTrimmer implementa a interface de ISecurityTrimmerPre na declaração de classe, conforme mostrado no código a seguir.
public class CustomSecurityPreTrimmer : ISecurityTrimmerPre
Para implementar os métodos de interface ISecurityTrimmerPre
Adicione o código a seguir para a declaração do método Initialize( ).
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
A versão básica desse exemplo não inclui qualquer código no método Initialize.
Adicione o código a seguir para a declaração do método AddAccess().
public IEnumerable<Tuple<Claim, bool>> AddAccess( IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //AddAccess method implementation, see steps 3-5. }
Para a primeira parte da implementação do método AddAccess, podemos descobrir quem é o usuário examinando o passedUserIdentity.
if (passedUserIdentity == null) { throw new ArgumentException("AddAccess method is called with invalid user identity parameter", "passedUserIdentity"); } String strUser = null; var claimsIdentity = (IClaimsIdentity)passedUserIdentity; if (claimsIdentity != null) { foreach (var claim in claimsIdentity.Claims) { if (claim == null) { continue; } // strUser is "domain\\\\user" format when web app is in Claims Windows Mode if (SPClaimTypes.Equals(claim.ClaimType, SPClaimTypes.UserLogonName)) { strUser = claim.Value; break; } // strUser2 is "S-1-5-21-2127521184-1604012920-1887927527-66602" when web app is in Legacy Windows Mode // In this case we need to convert it into NT user format. if (SPClaimTypes.Equals(claim.ClaimType, ClaimTypes.PrimarySid)) { strUser = claim.Value; SecurityIdentifier sid = new SecurityIdentifier(strUser); strUser = sid.Translate(typeof(NTAccount)).Value; break; } } }
Criar uma lista, preenche a lista com declarações e retornar a lista, conforme mostrado no código a seguir.
var claims = new LinkedList<Tuple<Claim, bool>>(); if (!string.IsNullOrEmpty(strUser)) { var groupMembership = GetMembership(strUser); if (!string.IsNullOrEmpty(groupMembership)) { var groups = groupMembership.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries); foreach (var group in groups) { claims.AddLast(new Tuple<Claim, bool>( new Claim("http://schemas.happy.bdc.microsoft.com/claims/acl", group), false)); } } } return claims; }
O método GetMembership contém a lógica personalizada do seu trimmer.
Criar um pós-filtro de segurança personalizado
Para criar o arquivo de classe para o pós-Cortador de segurança
- No menu projeto, escolha Adicionar Novo Item.
- Em Visual c# itensModelos instalados, clique em código e escolha classe..
- Digite CustomSecurityPostTrimmer.cse escolha Adicionar.
Como escrever o código de pós-Cortador de segurança personalizada
O Cortador de segurança personalizado deve implementar a interface ISecurityTrimmerPost. O exemplo de código nesta seção é uma implementação básica desta interface.
Para modificar o código de padrão no CustomSecurityPostTrimmer
Adicione as seguintes diretivas de using no início da classe:
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Security.Principal; using Microsoft.IdentityModel.Claims; using Microsoft.Office.Server.Search.Query; using Microsoft.Office.Server.Search.Administration;
Especifica que a classe CustomSecurityPostTrimmer implementa a interface de ISecurityTrimmerPost na declaração de classe, da seguinte maneira:
public class CustomSecurityPostTrimmer : ISecurityTrimmerPost
Para implementar os métodos de interface ISecurityTrimmerPost
Adicione o código a seguir para a declaração do método Initialize( ).
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
A versão básica desse exemplo não inclui qualquer código no método Initialize.
Adicione o código a seguir para a declaração do método CheckAccess().
public BitArray CheckAccess(IList<string> documentCrawlUrls, IList<string> documentAcls, IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //CheckAccess method implementation, see steps 3-5. }
Para a primeira parte da implementação do método CheckAccess, declarar e inicializar uma variável BitArray para armazenar os resultados da verificação de acesso para cada URL na coleção documentCrawlUrls e recuperar o usuário que enviou a consulta, conforme mostrado no código a seguir.
if (documentCrawlUrls == null) { throw new ArgumentException("CheckAccess method is called with invalid URL list", "documentCrawlUrls"); } if (documentAcls == null) { throw new ArgumentException("CheckAccess method is called with invalid documentAcls list", "documentAcls"); } if (passedUserIdentity == null) { throw new ArgumentException("CheckAccess method is called with invalid user identity parameter", "passedUserIdentity"); }
Percorrer cada URL de rastreamento na coleção e executar a verificação de acesso para determinar se o usuário que enviou que a consulta pode acessar a URL de rastreamento associadas item de conteúdo, conforme mostrado no código a seguir.
// Initialize the bit array with TRUE value which means all results are visible by default. var urlStatusArray = new BitArray(documentCrawlUrls.Count, true); var claimsIdentity = (IClaimsIdentity)passedUserIdentity; if (claimsIdentity != null) { var userGroups = GetGroupList(claimsIdentity.Claims); var numberDocs = documentCrawlUrls.Count; for (var i = 0; i < numberDocs; ++i) { if (!string.IsNullOrEmpty(documentAcls[i])) { urlStatusArray[i] = VerifyAccess(documentAcls[i], userGroups); } } }
Se o usuário tem acesso ao item de conteúdo, defina o valor do item BitArray naquele índice, urlStatusArray[i], para true; Caso contrário, defina-o para false.
Defina o valor de retorno do método CheckAccess para urlStatusArray, conforme mostrado no código a seguir.
return urlStatusArray;
Registrar o Cortador de segurança personalizado
Esta etapa descreve como configurar o Cortador de segurança personalizado e inclui as seguintes tarefas:
- Registrando o Cortador de segurança personalizada para o aplicativo de serviço de pesquisa usando os cmdlets Windows PowerShell.
- Reiniciando o SharePoint search host controller (SPSearchHostController).
Registrar o Cortador de segurança personalizado
Você usa o Shell de Gerenciamento do SharePoint para registrar um aparador de segurança personalizado com ClassName. No nosso caso, ClassName pode ser CustomSecurityPreTrimmer ou CustomSecurityPostTrimmer. O procedimento a seguir mostra como registrar um cortador de segurança personalizado, com a ID definida como 1 para o aplicativo de serviço de pesquisa.
Para registrar o Cortador de segurança personalizado
No Windows Explorer, localize CustomSecurityTrimmerSample.dll no caminho <Local_Drive>:\WINDOWS\assembly.
Abra o menu de atalho para o arquivo e escolha Propriedades.
Na guia Geral, na caixa de diálogo Propriedades, selecione o token e copiá-lo.
Abra o Shell de Gerenciamento do SharePoint. Para obter informações sobre como usar essa ferramenta, consulte Administrando aplicativos de serviço usando o Shell de Gerenciamento do SharePoint 2010
No prompt de comando, digite o seguinte comando:
New-SPEnterpriseSearchSecurityTrimmer -SearchApplication "Search Service Application" -typeName "CustomSecurityTrimmerSample.ClassName, CustomSecurityTrimmerSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=token" -RulePath "xmldoc://*"
No comando, substitua ClassName por CustomSecurityPreTrimmer ou CustomSecurityPostTrimmer e token pelo Token de Chave Pública para o arquivo CustomSecurityTrimmerSample.dll. Você deve associar todos os pós-cortes de uma regra de rastreamento, "xmldoc://*"; mas isso é opcional para conectáveis prévia.
Observação
[!OBSERVAçãO] Se você tiver vários servidores web front-end, você deve implantar seu Cortador de segurança no cache de assembly global em todos os servidores web front-end no farm.
Verifique se o Cortador de segurança é registrado com os seguintes cmdlets do PowerShell.
$searchApp = Get-SPEnterpriseSearchServiceApplication $searchApp | Get-SPEnterpriseSearchSecurityTrimmer
O Cortador de segurança deve estar visível nos resultados.
Para reiniciar o controlador de host de pesquisa do SharePoint
Você pode reiniciar o serviço de pesquisa digitando o seguinte cmdlet do PowerShell.
net restart sphostcontrollerservice