Проверка безопасности результатов поиска SharePoint 2013
-
29-09-2020 - |
Вопрос
У меня есть веб-приложение .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;
У меня есть два вопроса:
- В чем проблема с приведенным выше кодом, которая вызывает эту проблему с обрезкой безопасности?
- Если это не код, то каковы другие возможные причины этой проблемы?
Решение 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>
.