Поделиться через


Использование специального триммера безопасности для результатов поиска в SharePoint Server

В этом руководстве описано, как реализовать (создать, развернуть и зарегистрировать) настраиваемый триммер безопасности для Поиск в SharePoint с помощью Microsoft Visual Studio 2010.

Поиск в SharePoint выполняет обрезку результатов поиска во время запроса. Тем не менее может быть сценарии, в которых требуется выполнить фильтрацию по ролям безопасности. Поиск в SharePoint обеспечивает поддержку этих сценариев с помощью Microsoft.Office.Server.Поиск. Query.ISecurityTrimmerPre , Microsoft.Office.Server.Поиск. Интерфейсы Query.ISecurityTrimmerPost и ISecurityTrimmer2 (нерекомендуемые) в Microsoft.Office.Server.Поиск. Пространство имен запроса.

Существует два типа фильтрации по ролям безопасности: фильтрация по ролям перед и после усечения. Предварительная фильтрация по ролям относится к оценке предварительной запроса, где переопределяются запрос для добавления сведений о безопасности, перед которым сравнивается запроса в индекс поиска. После фильтрации по ролям относится к оценке после запроса, где результаты поиска, удаляются перед их возвращением для пользователя. Рекомендуется использовать предварительной фильтрации по ролям для повышения производительности и общие правильность; После фильтрации по ролям запрещает защиты от утечки информации для уточнения данных и экземпляры число попаданий.

Процесс регистрации триммера безопасности можно задать свойства конфигурации для настраиваемого триммера безопасности.

Обзор

Настраиваемая обрезка безопасности в Поиск в SharePoint состоит из двух интерфейсов, которые можно использовать для предварительной обрезки или последующей обрезки результатов поиска. В данном практическом руководстве рассматриваются оба интерфейса описывающий действия, необходимые для создания и регистрации собственного триммеры безопасности.

Предварительные условия

Для выполнения этой инструкции, необходимо установить следующие компоненты в среде разработки:

  • Поиск в Microsoft SharePoint
  • Microsoft Visual Studio 2010 или аналогичную Microsoft .NET Framework - средство совместимые разработки

Настройка проекта настраиваемого триммера безопасности

На этом этапе создания проекта настраиваемого триммера безопасности и затем добавление необходимых ссылок в проект.

Создание проекта для настраиваемого триммера безопасности

  1. Откройте Visual Studio и в меню Файл последовательно выберите элементы Создать и Проект.
  2. В окне типы проектов перейдите в раздел C# выберите пункт SharePoint.
  3. В области Шаблоны выберите Пустой проект SharePoint. В поле имя введите CustomSecurityTrimmerSample и затем нажмите кнопку ОК.
  4. В окне Мастер настройки SharePoint выберите Развернуть как решение фермы и нажмите кнопку Готово.

Добавление ссылок в проект настраиваемого триммера безопасности

  1. В меню Проект выберите пункт Добавить ссылку.

  2. На вкладке .NET выберите ссылки со следующими именами компонентов и затем нажмите кнопку ОК:

    • Компонент Microsoft Search

    Вы должны увидеть две записи на вкладке .NET с именем компонент компонент Microsoft Search. Выберите запись, в которой столбец Path \ISAPI\Microsoft.Office.Server.Search.dll. При отсутствии на вкладке .NET в диалоговом окне Добавление ссылок, необходимо добавить ссылку на вкладке Обзор, используя путь к Microsoft.Office.Server.Search.dll.

    • Microsoft.IdentityModel

    Если на вкладке .NETкомпонент Microsoft.IdentityModel отсутствует, необходимо добавить ссылку на Microsoft.IdentityModel.dll на вкладке Обзор с помощью по следующему пути:

    %ProgramFiles%\\Reference Assemblies\\Microsoft\\Windows Identity Foundation\\v4.0.

Создание пользовательского предварительной триммера безопасности

Чтобы создать файл класса для подготовки триммера безопасности

  1. В меню ПРОЕКТ выберите пункт Добавить новый элемент.
  2. В разделе Элементы Visual C# в разделе Установленные шаблоны выберите код и нажмите кнопку класса.
  3. Введите CustomSecurityPreTrimmer.cs и нажмите кнопку Добавить.

Написание кода предварительной фильтрации по ролям безопасности

Ваше настраиваемого триммера безопасности необходимо реализовать интерфейс ISecurityTrimmerPre. В следующем примере кода — это базовая реализацию этого интерфейса.

Изменение кода по умолчанию в CustomSecurityPreTrimmer

  1. Добавьте в начало класса следующие директивы using.

    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. Укажите, что класс CustomSecurityPreTrimmer реализует интерфейс ISecurityTrimmerPre в объявлении класса, как показано в следующем коде.

public class CustomSecurityPreTrimmer : ISecurityTrimmerPre

Реализация методов интерфейса ISecurityTrimmerPre

  1. Добавьте следующий код для объявления метода Initialize().

    public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication)
    {
    }
    

    Базовая версия в этом примере не включает любой код в метод Initialize.

  2. Добавьте следующий код для объявления метода AddAccess().

    public IEnumerable<Tuple<Claim, bool>> AddAccess(
                    IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity)
    {
      //AddAccess method implementation, see steps 3-5.
    }
    
  3. В первой части реализации метода AddAccess Узнайте пользователей, которые пользователь является, посмотрев 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. Создание списка, в списке с помощью утверждений и возврата списка, как показано в следующем коде.

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

    Метод GetMembership содержит настраиваемой логики вашей триммер.

Создание пользовательского после триммера безопасности

Чтобы создать файл класса для триммера безопасности после завершения

  1. В меню ПРОЕКТ выберите пункт Добавить новый элемент.
  2. В разделе Элементы Visual C# в разделе Установленные шаблоны выберите код, а затем выберите класс...
  3. Введите CustomSecurityPostTrimmer.csи нажмите кнопку Добавить.

Написание кода после фильтрации по ролям безопасности

Ваше настраиваемого триммера безопасности необходимо реализовать интерфейс ISecurityTrimmerPost. В примере кода в этом разделе представлена базовая реализацию этого интерфейса.

Изменение кода по умолчанию в CustomSecurityPostTrimmer

  1. Добавьте в начало класса следующие директивы using.

    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. Укажите, что класс CustomSecurityPostTrimmer реализует интерфейс ISecurityTrimmerPost в объявлении класса следующим образом:

    public class CustomSecurityPostTrimmer : ISecurityTrimmerPost
    

Реализация методов интерфейса ISecurityTrimmerPost

  1. Добавьте следующий код для объявления метода Initialize().

    public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication)
    {
    
    }
    

    Базовая версия в этом примере не включает любой код в метод инициализации.

  2. Добавьте следующий код для объявления метода CheckAccess().

    public BitArray CheckAccess(IList<string> documentCrawlUrls, IList<string> documentAcls, IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity)
    {
      //CheckAccess method implementation, see steps 3-5.
    }
    
  3. Первая часть реализации метода CheckAccess объявить и инициализировать переменную BitArray для хранения результатов проверки доступа для каждого URL-адреса в коллекции documentCrawlUrls и извлечения пользователя, который отправил запрос, как показано в следующем коде.

    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. Пройдитесь по каждой URL-адрес обхода в коллекции и выполните проверку доступа, чтобы определить, если пользователь, отправивший запрос можно получить доступ к URL-адрес обхода связанного элемента контента, как показано в следующем коде.

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

    Если у пользователя есть доступ к элемента контента, задайте значение элемента BitArray по этому индексу urlStatusArray[i], чтобы true; в противном случае — значение его false.

  5. Значение возвращаемое значение метода CheckAccessurlStatusArray, как показано в следующем коде.

    return urlStatusArray;
    

Зарегистрируйте пользовательский триммер безопасности.

Этот шаг описывается настройка настраиваемого триммера безопасности и включает в себя следующие задачи:

  • Регистрация настраиваемого триммера безопасности для приложения службы поиска с помощью командлетов Windows PowerShell.
  • Перезапуск SharePoint хост-контроллер поиска (SPSearchHostController).

Зарегистрируйте пользовательский триммер безопасности.

Командная консоль SharePoint используется для регистрации пользовательского триммера безопасности с помощью ClassName. В нашем случае className может иметь значение CustomSecurityPreTrimmer или CustomSecurityPostTrimmer. В следующей процедуре показано, как зарегистрировать пользовательский триммер безопасности, с Идентификатором, равным 1 для приложения службы поиска.

Регистрация настраиваемого триммера безопасности

  1. В Windows Обозреватель найдите CustomSecurityTrimmerSample.dll в пути <Local_Drive>:\WINDOWS\assembly.

  2. Откройте контекстное меню для файла и выберите пункт Свойства.

  3. На вкладке Общие диалогового окна Свойства выберите и скопируйте маркер.

  4. Откройте Командная консоль SharePoint. Сведения об использовании этого средства см. в статье Администрирование приложений-служб с помощью командной консоли SharePoint 2010.

  5. Введите в командной строке следующую команду.

    New-SPEnterpriseSearchSecurityTrimmer -SearchApplication "Search Service Application"
    -typeName "CustomSecurityTrimmerSample.ClassName, CustomSecurityTrimmerSample,
    Version=1.0.0.0, Culture=neutral, PublicKeyToken=token" -RulePath "xmldoc://*"
    

    В команде замените ClassNameна CustomSecurityPreTrimmer или CustomSecurityPostTrimmer , а маркер — маркером открытого ключа для файла CustomSecurityTrimmerSample.dll. Все конечные триммеры необходимо связать с правилом обхода, "xmldoc://*"; Однако это необязательно для подготовки триммеры.

    Примечание.

    [!Примечание] Если имеется несколько интерфейсных веб-серверов, необходимо развернуть триммер безопасности в глобальном кэше сборок на всех интерфейсных веб-серверов в ферме.

  6. Убедитесь, что следующие командлеты PowerShell зарегистрирован триммер безопасности.

    $searchApp = Get-SPEnterpriseSearchServiceApplication
    $searchApp | Get-SPEnterpriseSearchSecurityTrimmer
    

    Триммер безопасности должен отображаться в результатах.

Чтобы перезапустить хост-контроллер поиска SharePoint

  • Можно перезапустить службу поиска, введя следующий командлет PowerShell.

    net restart sphostcontrollerservice
    

См. также