سؤال

لدي تطبيق ويب .NET يعمل كموقع أمامي للمستخدمين، ويستفيد هذا التطبيق من تطبيق SharePoint 2013 المنفصل لخدمة البيانات للمستخدمين.كانت إحدى المهام هي تنفيذ البحث على الواجهة الأمامية من خلال الاستفادة من البحث الخاص بـ SharePoint.لقد قمت بحل هذه المشكلة عن طريق كتابة استعلامات البحث الخاصة بي باستخدام رمز جانب الخادم.

المشكلة التي أواجهها هي أنه على الرغم من ظهور نتائج البحث بشكل صحيح، إلا أنه لا يوجد أي تقليم أمني عليها.على سبيل المثال، إذا كان لدي مستندين، المستند أ والمستند ب، ولدي مستخدم يمكنه الوصول إلى المستند أ فقط، فسيظل البحث الذي يجريه المستخدم يعرض كلا المستندين.وبعد إجراء بعض الأبحاث، أدركت أن هذا قد يكون بسبب الطريقة التي أقوم بها بإنشاء استعلام البحث الخاص بي، ولكن حتى الآن لم أتمكن من إيجاد حل للمشكلة.إليك الرمز الذي يقوم بإنشاء استعلام البحث

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

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى sharepoint.stackexchange
scroll top