문제

사용자를 위한 프런트 엔드 사이트 역할을 하는 .NET 웹 응용 프로그램이 있는데 이 응용 프로그램은 별도의 SharePoint 2013 응용 프로그램을 활용하여 사용자에게 데이터를 제공합니다.작업 중 하나는 SharePoint의 자체 검색을 활용하여 프런트 엔드에 검색을 구현하는 것이었습니다.서버 측 코드를 사용하여 검색 쿼리를 작성하여 이 문제를 해결했습니다.

내가 겪고 있는 문제는 검색 결과가 올바르게 반환되었음에도 불구하고 검색 결과에 대한 보안 조정이 없다는 것입니다.예를 들어 문서 A와 문서 B라는 2개의 문서가 있고 문서 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

마침내 문제에 대한 해결책을 찾았습니다.나에게 올바른 방향을 알려준 Mike Lutge에게 감사드립니다.

재미있는 점은 그럼에도 불구하고 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 앱에서 실행 중이면 검색 쿼리를 사용자로서 사용자로 추가하려면 다음을 추가해야합니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top