Вопрос

У меня есть веб-приложение .NET, которое действует как интерфейсный сайт для пользователей, и это приложение использует отдельное приложение SharePoint 2013 для предоставления данных пользователям.Одна из задач состояла в том, чтобы реализовать поиск во внешнем интерфейсе, используя собственный поиск SharePoint.Я решил эту проблему, написав свои поисковые запросы с использованием серверного кода.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя результаты поиска возвращаются корректно, в них отсутствует защита.Например, если у меня есть 2 документа, документ A и документ B, и у меня есть пользователь, который может получить доступ только к документу A, поиск пользователем по-прежнему возвращает оба документа.После некоторых исследований я решил, что это может быть связано с тем, как я создаю свой поисковый запрос, но пока мне не удалось найти решение проблемы.Вот код, который создает поисковый запрос

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

У меня есть два вопроса:

  1. В чем проблема с приведенным выше кодом, которая вызывает эту проблему с обрезкой безопасности?
  2. Если это не код, то каковы другие возможные причины этой проблемы?
Это было полезно?

Решение 2

Наконец-то я нашел решение этой проблемы.Спасибо Майку Латжу за то, что указал мне правильное направление.

Самое смешное, что, хотя spSite.UserToken и spSite.RootWeb.CurrentUser оба ссылаются на пользователя, выполняющего поисковый запрос, поиск по-прежнему выполняется с использованием контекста системной учетной записи.Я считаю, что либо KeywordQuery или SearchExecutor класс игнорирует пользователя в spSite и запускает его автоматически от имени системной учетной записи.Чтобы заставить его выдавать себя за пользователя, я использовал этот код для создания 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);
}

Это позволяет мне запускать поисковые запросы с правильной настройкой безопасности для них.

Другие советы

Если код, который вы опубликовали выше, запущен в приложении SharePoint 2013, то для того, чтобы ваш поисковый запрос должен быть выполнен как пользователь, вам нужно будет добавить следующее в свой AppManifest.xml:

<AppPermissionRequests>
    <AppPermissionRequest Scope="http://sharepoint/search" Right="QueryAsUserIgnoreAppPrincipal" />
</AppPermissionRequests>
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top