سؤال

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

على سبيل المثال ، لدي فئة تسمى بوست ، والتي لديها بعض البيانات الوصفية النموذجية مثل العنوان ، ملخص ، الخ...

داخل بوست هو أسلوب ثابت يسمى نيوبوست الذي يعود سبليستيتم مهيأ مسبقا لاستخدامها في إنشاء وظائف جديدة.

public static SPListItem NewPost(string Title,string Summary)
{
   Posts = CoreLists.Posts();
   var item = Posts.AddItem();
   var item["Alias"] = SPContext.Current.Web.CurrentUser.LoginName;
   return item;
}

ستلاحظ أنا الحصول على سبليست من خلال فئة مساعد يسمى كوريليستس

public static class CoreLists
{
   public static SPList Posts()
   {
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts");
   }
}

هذا يجعل بعض طرق البيانات النظيفة لطيفة.ما أنا على التوالي في ل ، هو أنني لا يمكن العثور على وسيلة لائقة لاستدعاء هذه الأساليب مع SPSecurity.RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges لا يمكن أن تعمل مع كتلة إرجاع ، لذلك عندما أحاول إنشاء عنصر قائمة جديد ، فإنه يفشل في كل مرة.

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

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

هل أحتاج إلى إعادة التفكير في طبقة الوصول إلى البيانات بالكامل?هل يتعارض قرار تقييد الوصول إلى القائمة تماما مع الرغبة في طبقة وصول بيانات أنظف?

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

المحلول

أنت تستخدم SPContext.Current.Web داخل SPSecurity.RunWithElevatedPrivileges مندوب?

هذا لن ينجح.الحصول على الاشياء مع SPContext يعطيك الكائنات التي لديها سياق مستخدم مسجل حاليا, ، وليس واحد مرتفع.وهذا يعني أنه إذا قمت بإنشاء إدخال قائمة جديدة باستخدام الكائنات التي تأتي من SPContext, ، سيتم إنشاؤها في سياق الأمان للمستخدم الذي قام بتسجيل الدخول حاليا ، وليس المستخدم المرتفع الذي تعتقد أنه يقوم بإنشائه.

إذا كنت ترغب في إنشاء إدخالات القائمة باستخدام شاريبوانت\النظام ، تحتاج إلى فتح كائنات سبسيت/سبويب جديدة داخل سبكوريتي.رونيثليفاتدبريفيليجيس تفويض والعمل مع تلك بدلا من ذلك.

حاول تغيير هذا:

   public static SPList Posts() 
   { 
      return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts"); 
   } 

إلى هذا:

   public static SPList Posts() 
   { 
        using( var s = new SPSite(SPContext.Current.Site.ID)
        {
            using( var w = SPSite.OpenWeb(SPContext.Current.Web.ID)
            {
                 var postsList = w.Lists.TryGetList("Posts"); 
                 if( postsList != null )
                      return postsList;
                 else
                    /* do proper error handling */
            }
        }
    }

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

اقرأ المزيد عن رفع الامتياز على مسن:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx

نصائح أخرى

لا تستخدم RWEP.انت لست بحاجة اليه.

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

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

نقاط Vedrans Re UI / Security على حق تماما - إذا كنت تقوم بإعادة كتابة نظام الأمان، فأنت تعمل ضد الحبوب كما كانت. لكن قد لا تزال ترغب في الاستفادة من الأمان (وغيرها من فوائد SharePoint)، لذلك ليس بالكامل عقلي لبناء تطبيق على SharePoint.

للحصول على بنية أكثر شهرة تعتمد - استخدم موقع النشر.هذا يمنحك:

  1. شريط SharePoint UI القياسي للقوائم وما إلى ذلك - هذا هو عرض المسؤول "Backstage".
  2. مكتبة الصفحات مع صفحة رئيسية منفصلة / UI - هذه هي واجهة "التطبيق".

    الافتراضي (جميع المستخدمين المصادقين) احصل على الوصول إلى المشاهد إلى الموقع.يحصل مستخدمو "المسؤول" على أذونات مساهمة / صريحة للقوائم، أيا كان ذلك.

    يمكن للمساعدةين الوصول إلى بيانات الموقع فقط من خلال أجزاء / رمز مخصص في واجهة التطبيق.

مفهومك كله خاطئ.

إذا كنت تقوم بتطوير واجهة المستخدم الخاصة بك والأمن ثم لماذا تستخدم شاريبوانت?باستخدام سكل هو أنظف بكثير.

في كل مرة تستخدم فيها SPSecurity.RunWithElevatedPrivileges في رمز الأمن شاريبوانت للخطر لأنك تسمح للمستخدم الحالي ليكون بمثابة شاريبوانت \ النظام والحصول على كل شيء.

راجع للشغل يمكنك تعيين 'الخالق' عند تشغيل تحت SPSecurity.RunWithElevatedPrivileges

//First store current user
SPUser currentUser = SPContext.Current.Web.CurrentUser;

SPSecurity.RunWithElevatedPrivileges(delegate 
{
    using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Url))
    using (SPWeb targetWeb = elevatedSite.OpenWeb(webUrl))
    {
       //Code to get your item or to add a new one

       // Replace 'System Account' with current user
       item["Author"] = currentUser;
       item["Editor"] = currentUser;
       item.SystemUpdate();
    }
});

إضافة:

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

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