لا يمكن السماح للزائرين بإضافة جزء ويب خاص بالمستخدم في بعض الصفحات فقط

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/65621

سؤال

في بوابة الإنترانت الخاصة بالشركة، أريد السماح لأي زائر (أي مستخدم تمت مصادقته) بتخصيص بعض الصفحات باستخدام أجزاء ويب الخاصة بالمستخدم.

أريد تقييد هذا التخصيص على بعض الصفحات فقط.

لقد قمت الآن بإنشاء مستوى إذن جديد "تخصيص أجزاء ويب المستخدم"، والذي يحدد هذه الأذونات:

  • إضافة وتخصيص الصفحات
  • إضافة/إزالة أجزاء الويب الشخصية
  • تحديث أجزاء الويب الشخصية

هذه هي أصغر مجموعة من الأذونات التي أجدها للسماح بإضافة أجزاء ويب للمستخدم.

يوجد في بوابتي "زائر بوابتي" مجموعة.

إذا قمت بالتقدم إلى هذه المجموعة بمستوى الإذن المخصص (الحفاظ على مستوى إذن القراءة OOB) في الويب المستوى، يمكنني إضافة أجزاء ويب المستخدم على الصفحات.

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

هل من الممكن تطبيق هذه الأذونات على صفحات محددة فقط؟

يرجى ملاحظة أنني يستطيع إزالة أجزاء الويب أو تحديثها.إنها تضيف فقط جزء الويب المقيد.

لمعلوماتك، تتم إضافة أجزاء الويب فعليًا عن طريق التعليمات البرمجية، من جزء ويب "مدير" مخصص.

على وجه الخصوص، هذا الرمز يطرح الاستثناء:

var mgr = web.GetLimitedWebPartManager(file.ServerRelativeUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.User);
var wpFile = web.GetCatalog(SPListTemplateType.WebPartCatalog).RootFolder.Files["somewebpart.webpart"];
System.Web.UI.WebControls.WebParts.WebPart newWebPart;
using (var raw = wpFile.OpenBinaryStream())
{
    using (var xr = XmlReader.Create(raw))
    {
        string error;
        newWebPart = mgr.ImportWebPart(xr, out error); 
    }
}

ال ImportWebPart الطريقة تطرح بعض الاستثناءات الغامضة:

Microsoft.SharePoint.ApplicationRuntime.SafeControls+UnsafeControlException: A Web Part or Web Form Control on this Page cannot be displayed or imported. You don't have Add and Customize Pages permissions required to perform this action
   à Microsoft.SharePoint.WebPartPages.WebPartImporter.CreateWebPart(Boolean clearConnections)
   à Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, Uri webPartPageUri, SPWeb spWeb)
   à Microsoft.SharePoint.WebPartPages.WebPartImporter.Import(SPWebPartManager manager, XmlReader reader, Boolean clearConnections, SPWeb spWeb)
   à Microsoft.SharePoint.WebPartPages.SPWebPartManager.ImportWebPart(XmlReader reader, String& errorMessage)
   à Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.ImportWebPart(XmlReader reader, String& errorMessage)
   à x.y.z.ImportWebPart(SPLimitedWebPartManager mgr, SPFile wpFile)

في سجلات ULS، أرى هذا فقط:

حدث خطأ أثناء استيراد جزء ويب.التجميع Microsoft.SharePoint، الإصدار=14.0.0.0، الثقافة=محايدة، PublicKeyToken=71e9bce111e9429c، TypeName.Microsoft.SharePoint.WebPartPages.ContentEditorWebPart

وهو أمر مزعج للغاية.

[يحرر] مع العاكس، وجدت في WebPartImporter.CreateWebPart طريقة هذا التحقق:

     if ((!this._spWeb.AllowContributorsToEditScriptableParts && !this._spWeb.DoesUserHavePermissions(SPBasePermissions.EmptyMask | SPBasePermissions.AddAndCustomizePages)) && !this._spWeb.SafeControls.SafeAgainstScript(this._type, out unsafeErrorMessage))
        {
            throw new SafeControls.UnsafeControlException(SafeControls.UnsafeControlException.MakeGenericUnsafeExceptionMessage(unsafeErrorMessage));
        }

في الواقع، يتحقق رمز إضافة جزء ويب من الإذن الموجود على SPWeb هدف.

هل يجب أن أستنتج أن السيناريو الخاص بي غير مدعوم؟:(

هل كانت مفيدة؟

المحلول

بعد بعض التجارب، هنا يبدو أنه يعمل حل :

var web = SPContext.Current.Web;

var mgr = web.GetLimitedWebPartManager(file.ServerRelativeUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.User);


var wpFile = web.GetCatalog(SPListTemplateType.WebPartCatalog).RootFolder.Files["somewebpart.webpart"];



/* Elevated the process just for importing the webpart */
var elevatedWeb = GetElevatedWeb(web); // Get an elevated Web object, that points on the same web
var elevatedMgr = elevatedWeb.GetLimitedWebPartManager(file.ServerRelativeUrl, System.Web.UI.WebControls.WebParts.PersonalizationScope.User);
System.Web.UI.WebControls.WebParts.WebPart newWebPart;
using (var raw = wpFile.OpenBinaryStream())
{
    using (var xr = XmlReader.Create(raw))
    {
        string error;
        newWebPart = elevatedMgr.ImportWebPart(xr, out error); 
    }
}


/* Import the webpart, created in the elevated context, but into the current user's context. */
mgr.AddWebPart(newWebPart, "Left", 0);

في الأساس، كانت الفكرة هي استيراد جزء الويب ضمن سياق مرتفع، مع إضافة جزء الويب المستورد في السياق الحالي الفعلي.

يبدو أن الأمر ناجح، لكنني لست معجبًا جدًا بآلية القرصنة هذه.

نصائح أخرى

تريد السماح لأي زائر (أي مستخدم تمت مصادقته) بتخصيص بعض الصفحات باستخدام أجزاء ويب الخاصة بالمستخدم... أليس كذلك؟

كيف نفعل ذلك حيث أعمل، أنشأنا مجموعة تتضمن حسابات جميع المستخدمين المصادق عليهم.يمكننا تطبيق مجموعة الأذونات هذه على أي مستوى، وتوثيقها من خلال مجموعة مواقع كاملة.

آمل أن يساعدك هذا بطريقة ما ...

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

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