SharePoint 2013検索結果セキュリティトリミング
-
29-09-2020 - |
質問
私はユーザーのフロントエンドサイトとして機能する.NET Webアプリケーションを持っており、このアプリケーションは別のSharePoint 2013アプリケーションを利用してユーザーにデータを提供します。一つのタスクの1つは、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つの質問があります:
- このセキュリティトリミングの問題を引き起こしている上記のコードに関する問題は何ですか?
- コードではない場合、この問題の他の考えられる原因は何ですか?
解決 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アプリで実行されている場合、検索クエリをユーザーとして実行するためには、AppManifest.xmlに次のものを追加する必要があります。
<AppPermissionRequests>
<AppPermissionRequest Scope="http://sharepoint/search" Right="QueryAsUserIgnoreAppPrincipal" />
</AppPermissionRequests>
.