نموذج كائن العميل يعطي 401 عند انتحال تسجيل الدخول المستخدم-مفك التطبيق

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

  •  09-12-2019
  •  | 
  •  

سؤال

لدي ASP.NET مفك التطبيق الذي يربط شاريبوانت 2010 عبر أوم العميل.عندما أركض ExecuteQuery(), ، أحصل على خطأ هتب 401 من شاريبوانت.

لدي التطبيق مفك تعيين لانتحال شخصية تسجيل الدخول المستخدم.

إعداد انتحال الشخصية في الويب.التكوين (من التطبيق مفك):

<configuration>
    <system.web>
        <identity impersonate="true" />
    </system.web>
</configuration>

الرمز:

Client Context ctx = new ClientContext("http://sharepoint.company.com/site");
ctx.Credentials = CredentialCache.DefaultNetworkCredentials;

Web web = ctx.Web;
ListCollection lists = web.Lists;

ctx.Load(web);
ctx.Load(lists);

ctx.ExecuteQuery();

الاستثناء:

نظام. صافي. ويبكسيبتيون:أعاد الخادم البعيد خطأ:(401) غير مصرح به.<url> () في مايكروسوفت.شير.العميل.<url>.تنفيذ() في مايكروسوفت.شير.العميل.كلينتكونتيكست.إنسوريفورمديجيست() في مايكروسوفت.شير.العميل.كلينتكونتيكست.إكسكوتيكيري() في مفكاب.الخدمات.شاريبوينتسرفيس.الحصول على المكتبات()

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

تم تكوين التطبيق لمصادقة ويندوز ، والمصادقة المجهولة هو تعطيل في إيس.

الأشياء التي جربناها:

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

ماذا يمكنني أن أفعل للحصول على أوم العميل لتفويض أذونات المستخدم عند الاتصال شاريبوانت?


تحديث

ومن المثير للاهتمام ، حاولت ويبركست بسيطة إلى شاريبوانت ، مع نتائج متطابقة ، الذي يقول لي أن المشكلة ليست ناجمة عن أوم العميل:

WebRequest request = WebRequest.Create("http://xxxxxxxxx");
request.Credentials = CredentialCache.DefaultNetworkCredentials;

using(WebResponse response = request.GetResponse())
using(StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    return Content(reader.ReadToEnd(), "text/html");
}
هل كانت مفيدة؟

المحلول

هذا يبدو وكثيرا وكثيرا، حيث تضرب NTLM مشكلة قفز مزدوجة وأنا آسف أن أقول أنه لا توجد طريقة حولها جانبا من تغيير مصادقةك للمطالبات أو كيربروس.لا ينبغي لأي منها أن تؤخذ طفيفة.

إذا كان الرمز الخاص بك يعمل على إحدى الأجهزة الموجودة في مزرعة SharePoint، فأنت تحاول التفاعل مع ذلك، فمن المحتمل أن تحصل على هذا من خلال تخطي ثاني 'Hop' تماما والتفاعل مع SharePoint مباشرة عبر نموذج الكائن علىخادم بدلا من من خلال خدمات الويب.

نصائح أخرى

لقد مر ما يقرب من عامين ولكن مؤخرًا واجهت نفس المشكلة مع SharePoint 2013 (لقد قمت بالفعل بالوصول إلى SP2013 باستخدام مكتبات SP 2010 CSOM).أخيرًا تمكنت من حل الأمر.

أولاً، أفترض أن مصادقة Kerberos كانت تعمل بشكل صحيح في حالتك.ولكي تكون في الجانب الآمن، يمكنك إيقاف تشغيل مصادقة NTML في إعدادات IIS أو عرضها على صفحة الاختبار الخاصة بك

Thread.CurrentPrincipal.Identity.AuthenticationType

يجب ان يكون تفاوض.ليس هناك فائدة من تجربة التفويض عندما تقوم بالفعل بتسجيل الدخول باستخدام NTML، وهو ما يمكن أن يحدث عندما يتم السماح لكليهما.

التالي، التحديث لسؤالك.لقد ساعدني ذلك كثيرًا، وأدركت أنه لا ينبغي لنا أن نقلق بشأن CSOM عندما لا يعمل أبسط التفويض باستخدام WebRequest.المشكلة هنا.

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

وهناك شيء آخر واضح تمامًا – يجب تكوين SharePoint نفسه بشكل صحيح لمصادقة Kerberos.

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

الفرق هو أنني (1) استخدمت SP2013 مع CSOM 2010، (2) قمت بتشغيل التفويض لجزء معين فقط بدلاً من الطلب بأكمله:

string ImpersonatedSpLogin = null, ImpersonatedSpMail = null;

WindowsIdentity identity = (WindowsIdentity)User.Identity;
using (var impersonationContext = identity.Impersonate())
{
    using (ClientContext context = new ClientContext("http://myServer.somewhere.com/"))
    {
        context.Load(context.Web.CurrentUser);
        context.ExecuteQuery();
        ImpersonatedSpLogin = context.Web.CurrentUser.LoginName;
        ImpersonatedSpMail = context.Web.CurrentUser.Email;
    }

    impersonationContext.Undo();
}
// now you can verify by checking  ImpersonatedSpLogin and ImpersonatedSpMail

نأمل أن يساعد أي شخص.

هل لديك <authentication mode="Windows" /> هناك في مكان ما كذلك?وأعتقد أن هذا مطلوب أيضا.

يحتوي الرابط أدناه على بعض المعلومات حول إخراج بعض المتغيرات بناء على إعدادات تكوين الويب.التكوين و إيس

https://stackoverflow.com/a/1688220/1282079

هل يساعد الرابط أدناه؟أنا أيضا مواجهة مشكلة مماثلة.

href="https://stackoverflow.com/questions/11691650/getListIMS-REQUEST-FIALED-WITH-HTTP-Status-401-unauthorized/11843756#11843756"> https://stackoverflow.com/Questions/ 11691650 / GETLESTITEMS- طلب - فشل - مع HTTP-Status-401-Unautorized / 11843756 # 11843756

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