Compartilhar via


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

  1. Abra Visual Studio e escolha arquivo, novoprojeto.
  2. Em tipos de projeto, em c#, escolha SharePoint.
  3. Em modelos, escolha o Projeto vazio do SharePoint. No campo nome, digite CustomSecurityTrimmerSample e escolha o botão OK.
  4. 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

  1. No menu Projeto, escolha Adicionar Referência.

  2. 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

  1. No menu projeto, escolha Adicionar Novo Item.
  2. Em Visual c# itensModelos instalados, clique em código e escolha classe.
  3. 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

  1. 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;
    
  2. 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

  1. 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.

  2. 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.
    }
    
  3. 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;
             }
          }
    }
    
  4. 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

  1. No menu projeto, escolha Adicionar Novo Item.
  2. Em Visual c# itensModelos instalados, clique em código e escolha classe..
  3. 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

  1. 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;
    
  2. 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

  1. 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.

  2. 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.
    }
    
  3. 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");
    }
    
  4. 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.

  5. 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

  1. No Windows Explorer, localize CustomSecurityTrimmerSample.dll no caminho <Local_Drive>:\WINDOWS\assembly.

  2. Abra o menu de atalho para o arquivo e escolha Propriedades.

  3. Na guia Geral, na caixa de diálogo Propriedades, selecione o token e copiá-lo.

  4. 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

  5. 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.

  6. 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
    

Confira também