Использование специального триммера безопасности для результатов поиска в 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 - средство совместимые разработки
Настройка проекта настраиваемого триммера безопасности
На этом этапе создания проекта настраиваемого триммера безопасности и затем добавление необходимых ссылок в проект.
Создание проекта для настраиваемого триммера безопасности
- Откройте Visual Studio и в меню Файл последовательно выберите элементы Создать и Проект.
- В окне типы проектов перейдите в раздел C# выберите пункт SharePoint.
- В области Шаблоны выберите Пустой проект SharePoint. В поле имя введите CustomSecurityTrimmerSample и затем нажмите кнопку ОК.
- В окне Мастер настройки SharePoint выберите Развернуть как решение фермы и нажмите кнопку Готово.
Добавление ссылок в проект настраиваемого триммера безопасности
В меню Проект выберите пункт Добавить ссылку.
На вкладке .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.
Создание пользовательского предварительной триммера безопасности
Чтобы создать файл класса для подготовки триммера безопасности
- В меню ПРОЕКТ выберите пункт Добавить новый элемент.
- В разделе Элементы Visual C# в разделе Установленные шаблоны выберите код и нажмите кнопку класса.
- Введите CustomSecurityPreTrimmer.cs и нажмите кнопку Добавить.
Написание кода предварительной фильтрации по ролям безопасности
Ваше настраиваемого триммера безопасности необходимо реализовать интерфейс ISecurityTrimmerPre. В следующем примере кода это базовая реализацию этого интерфейса.
Изменение кода по умолчанию в CustomSecurityPreTrimmer
Добавьте в начало класса следующие директивы 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;
Укажите, что класс CustomSecurityPreTrimmer реализует интерфейс ISecurityTrimmerPre в объявлении класса, как показано в следующем коде.
public class CustomSecurityPreTrimmer : ISecurityTrimmerPre
Реализация методов интерфейса ISecurityTrimmerPre
Добавьте следующий код для объявления метода Initialize().
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
Базовая версия в этом примере не включает любой код в метод Initialize.
Добавьте следующий код для объявления метода AddAccess().
public IEnumerable<Tuple<Claim, bool>> AddAccess( IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //AddAccess method implementation, see steps 3-5. }
В первой части реализации метода 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; } } }
Создание списка, в списке с помощью утверждений и возврата списка, как показано в следующем коде.
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 содержит настраиваемой логики вашей триммер.
Создание пользовательского после триммера безопасности
Чтобы создать файл класса для триммера безопасности после завершения
- В меню ПРОЕКТ выберите пункт Добавить новый элемент.
- В разделе Элементы Visual C# в разделе Установленные шаблоны выберите код, а затем выберите класс...
- Введите CustomSecurityPostTrimmer.csи нажмите кнопку Добавить.
Написание кода после фильтрации по ролям безопасности
Ваше настраиваемого триммера безопасности необходимо реализовать интерфейс ISecurityTrimmerPost. В примере кода в этом разделе представлена базовая реализацию этого интерфейса.
Изменение кода по умолчанию в CustomSecurityPostTrimmer
Добавьте в начало класса следующие директивы 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;
Укажите, что класс CustomSecurityPostTrimmer реализует интерфейс ISecurityTrimmerPost в объявлении класса следующим образом:
public class CustomSecurityPostTrimmer : ISecurityTrimmerPost
Реализация методов интерфейса ISecurityTrimmerPost
Добавьте следующий код для объявления метода Initialize().
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
Базовая версия в этом примере не включает любой код в метод инициализации.
Добавьте следующий код для объявления метода CheckAccess().
public BitArray CheckAccess(IList<string> documentCrawlUrls, IList<string> documentAcls, IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //CheckAccess method implementation, see steps 3-5. }
Первая часть реализации метода 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"); }
Пройдитесь по каждой 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.
Значение возвращаемое значение метода CheckAccessurlStatusArray, как показано в следующем коде.
return urlStatusArray;
Зарегистрируйте пользовательский триммер безопасности.
Этот шаг описывается настройка настраиваемого триммера безопасности и включает в себя следующие задачи:
- Регистрация настраиваемого триммера безопасности для приложения службы поиска с помощью командлетов Windows PowerShell.
- Перезапуск SharePoint хост-контроллер поиска (SPSearchHostController).
Зарегистрируйте пользовательский триммер безопасности.
Командная консоль SharePoint используется для регистрации пользовательского триммера безопасности с помощью ClassName. В нашем случае className может иметь значение CustomSecurityPreTrimmer или CustomSecurityPostTrimmer. В следующей процедуре показано, как зарегистрировать пользовательский триммер безопасности, с Идентификатором, равным 1 для приложения службы поиска.
Регистрация настраиваемого триммера безопасности
В Windows Обозреватель найдите CustomSecurityTrimmerSample.dll в пути <Local_Drive>:\WINDOWS\assembly.
Откройте контекстное меню для файла и выберите пункт Свойства.
На вкладке Общие диалогового окна Свойства выберите и скопируйте маркер.
Откройте Командная консоль SharePoint. Сведения об использовании этого средства см. в статье Администрирование приложений-служб с помощью командной консоли SharePoint 2010.
Введите в командной строке следующую команду.
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://*"; Однако это необязательно для подготовки триммеры.
Примечание.
[!Примечание] Если имеется несколько интерфейсных веб-серверов, необходимо развернуть триммер безопасности в глобальном кэше сборок на всех интерфейсных веб-серверов в ферме.
Убедитесь, что следующие командлеты PowerShell зарегистрирован триммер безопасности.
$searchApp = Get-SPEnterpriseSearchServiceApplication $searchApp | Get-SPEnterpriseSearchSecurityTrimmer
Триммер безопасности должен отображаться в результатах.
Чтобы перезапустить хост-контроллер поиска SharePoint
Можно перезапустить службу поиска, введя следующий командлет PowerShell.
net restart sphostcontrollerservice