الحصول على المستخدم الذي قام بتسجيل الدخول باستخدام SPWeb، بغض النظر عن الامتيازات المرتفعة

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

سؤال

لدي شرط أن أكون قادرًا دائمًا على الحصول على المستخدم الذي قام بتسجيل الدخول.

الكائن الذي ستمرره عملية الاستدعاء هو spweb.

نظرًا لأن هذا رمز قديم، فلا يمكنني تغيير ما ترسله عمليات الاستدعاء، وإليك المشكلة:بعضهم يمرر في SPWeb قيد التشغيل كما هو، والبعض الآخر يرسل SPWeb الذي يتمتع بامتيازات مرتفعة.بالنسبة للامتيازات المرتفعة، يتم إرجاع المستخدم الذي قام بتسجيل الدخول كـ System.out.

في كلتا الحالتين أريد الحصول على المستخدم الحالي الذي قام بتسجيل الدخول.

هل هذا بكل الأحوال ممكن؟

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

المحلول

لديك حالتان محتملتان هنا.

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

الحالة ب:يتم استدعاء الأسلوب داخل مفوض RunWithElevatedPrivilegesفي هذه الحالة، لن يفيدك إعادة إنشاء مثيل SPWeb.سيظل أي مثيل جديد مرتفعًا، لذا فهذا أمر محظور.للهروب من هذا الموقف، تحتاج إلى العثور على مثيل تم إنشاؤه خارج نطاق الارتفاع.كيف؟من خلال استغلال سياق التنفيذ الخاص بك:على سبيل المثال، في متلقي حدث الميزة، يمكنك الوصول إلى مثيل الويب في خصائص الحدث وما إلى ذلك.نظرًا لأنك تستخدم طريقة مخصصة ولا يمكنك تغيير المعلمات المستلمة، فأنت بحاجة إلى الوصول إلى نوع ما من السياق.هل يمكنك اللجوء إلى SPContext.Current.Web؟هذا المثيل ليس مرتفعًا، لذلك يجب أن يكون المستخدم هو الشخص الحالي الذي يتصفح الموقع.ومع ذلك، قد تكون في موقف حيث يكون السياق غير صالح/خالي، وفي هذه الحالة لا توجد طريقة AFAIK للحصول على المستخدم الأصلي من المثيل المرتفع:ستحتاج إلى تخزينه في مكان ما (نصيحة:مفردة ثابتة؟) قبل الدخول في سياق الارتفاع.


يحرر

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

بناءً على هذا، يبدو أن أفضل رهان لك هو استخدام المستخدم من SPContex عندما يكون ذلك ممكنًا، وافتراض أن المستخدم المرتفع وغير المرتفع هو نفسه عندما يكون السياق فارغًا.خذ ذلك مع حبة الملح على الرغم من ...

نصائح أخرى

كما ذكر Fazio المطور الأصلي الذي جعل رمز الموعد الذي يجب أن يستخدم الانتحال لاجتياز كائن Spweb، ولكن في حالتك لا يمكنك!

رفع يعني كائن SPWeb الخاص بك مرتفعا إلى مستخدم النظام وسيعود هذا المستخدم بغض النظر عن كائن Spweb يتم التخلص منها! giveacodicetagpre.

سيعمل الرمز أعلاه إذا كان خارج كائن Spweb المرتفع ولكن إذا كان داخل الكتلة المرتفعة سيعود حساب النظام أمر مؤسف!

هل يمكنك نشر بعض الكود؟أو أعطنا بعض المعلومات أكثر من حيث سوف تستخدمك كائن Spweb الذي تم تمريره؟ربما يمكنك استخدام التعليمات البرمجية أعلاه في كائن SPWeb مفتوح الحالي ثم قم بتعيين كائن SpWeb إلى الكائن المرتفع؟

لكن الإجابة القصيرة لا يمكنك الحصول على المستخدم الفعلي المسجل المستخدم من مستخدم مرتفع!

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