سؤال

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

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

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

بالمناسبة لدي أي سيطرة على الخادم ، وذلك بعد ذلك العودة مخصص رمز الحالة (أي شيء آخر غير 401) ليس خيارا.

هل هناك أي طريقة أستطيع أن قمع المصادقة الحوار ؟ على وجه الخصوص ، يمكن أن قمع المصادقة المطلوبة الحوار في فايرفوكس 2 أو في وقت لاحق ؟ هل هناك أي طريقة لمنع الاتصال [host] الحوار في IE 6 و في وقت لاحق ؟


تحرير
معلومات إضافية من صاحب البلاغ (سبتمبر.18):
وأود أن أضيف أن المشكلة الحقيقية مع المتصفح حوار المصادقة ظهرت أنها تعطي معلومات كافية للمستخدم.

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

الحوار لا اعتراف الواقع هو فقط هل أدخل اسم المستخدم وكلمة المرور.لا بوضوح أن هناك مشكلة وأنه يجب أن تحاول مرة أخرى.بدلا من مربع الحوار يعرض المستخدم مع خفي المعلومات مثل "الموقع يقول:'[عالم]'." حيث [عالم] هو باختصار عالم الاسم فقط مبرمج يمكن أن أحب.

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

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

المحلول

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

  1. ربما فلاش يعالج هذا بشكل مختلف (لم أجربه بعد) ، وذلك بعد فيلم فلاش جعل الطلب قد تساعد.

  2. يمكنك إعداد 'proxie عن الخدمة التي كنت الحصول على الخادم الخاص بك ، ويكون ذلك تعديل المصادقة رؤوس قليلا ، حتى أن المتصفح لا تعترف بهم.

نصائح أخرى

أنا واجهت نفس المشكلة هنا و الخلفية مهندس في شركة تنفيذ السلوك الذي هو على ما يبدو يعتبر ممارسة جيدة :عندما ندعو إلى URL ترجع 401 ، إذا كان العميل لديه مجموعة رأس X-Requested-With: XMLHttpRequest, الخادم يسقط www-authenticate رأس في ردها.

الآثار الجانبية هو أن المصادقة الافتراضي المنبثقة لا يظهر.

تأكد من أن استدعاء API لديه X-Requested-With رأس مجموعة XMLHttpRequest.إذا كان هناك هو أن تفعل شيئا ما عدا تغيير الخادم السلوك وفقا لهذه الممارسة الجيدة...

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

  1. حالة HTTP هو 4xx
  2. WWW-Authenticate رأس موجود في الرد

إذا كنت تستطيع السيطرة على استجابة HTTP, ثم يمكنك إزالة WWW-Authenticate رأس من استجابة المتصفح لن المنبثقة مربع حوار تسجيل الدخول.

إذا كنت لا تستطيع التحكم في الاستجابة ، يمكنك إعداد بالوكالة لتصفية WWW-Authenticate رأس من الاستجابة.

بقدر ما أعرف (لا تتردد في تصحيح لي إذا كنت مخطئا), لا توجد وسيلة لمنع موجه تسجيل الدخول مرة واحدة المتصفح يتلقى WWW-Authenticate رأس.

وأنا أدرك أن هذا السؤال إجابات قديمة جدا.ولكن انتهى بي الأمر هنا.وربما آخرون.

إذا كان لديك الوصول إلى قانون خدمة ويب التي تعود 401.ببساطة تغيير الخدمة للعودة 403 (Forbidden) في هذه الحالة بدلا 401.المتصفح لن المطالبة ببيانات الاعتماد في استجابة 403.403 هو الكود الصحيح عن مصادقة المستخدم غير مخول معين من الموارد.والتي يبدو أن الوضع من البروتوكول الاختياري.

من IETF الوثيقة على 403:

الخادم الذي يتلقى بيانات اعتماد صالحة غير كافية الوصول يجب أن تستجيب مع 403 (Forbidden) رمز الحالة

في موزيلا يمكنك تحقيق ذلك مع البرنامج النصي التالي عند إنشاء كائن مدعوم:

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

2 خط يمنع مربع الحوار....

ما server التكنولوجيا التي تستخدمها و هل هناك منتج معين يمكنك استخدام المصادقة ؟

منذ المتصفح فقط القيام بعملها, أعتقد أن لديك لتغيير الأمور على جانب الملقم على عدم العودة 401 رمز الحالة.ويمكن أن يتم ذلك باستخدام مخصص مصادقة النماذج التي ببساطة إعادة النموذج مرة أخرى عندما فشل المصادقة.

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

يناير.vdbergh له الحقيقة, إذا كان يمكنك تغيير 401 على جانب الملقم على آخر رمز الحالة ، فإن المتصفح لن قبض والطلاء المنبثقة.حل آخر يمكن تغيير مصادقة WWW رأس آخر رأس مخصص.أنا لا أصدق لكن المتصفح لا يمكن أن تدعم ذلك ، في بعض الإصدارات من فايرفوكس يمكننا أن نفعل xhr الطلب مع mozBackgroundRequest لكن في المتصفحات الأخرى??هنا, هناك اهتمام الرابط مع هذه المسألة في الكروم.

لدي نفس المشكلة مع MVC 5 VPN حيث كلما نحن خارج DMZ باستخدام VPN, نجد أنفسنا مضطرين للإجابة على هذا المتصفح رسالة.باستخدام .صافي أنا ببساطة مقبض التوجيه من الخطأ استخدام

<customErrors defaultRedirect="~/Error"  >
  <error statusCode="401" redirect="~/Index"/>
</customErrors>

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

      DirectoryEntry entry = new DirectoryEntry("LDAP://OurDomain");
      DirectorySearcher Dsearch = new DirectorySearcher(entry);
      Dsearch.Filter = "(SAMAccountName=" + UserID + ")";
      Dsearch.PropertiesToLoad.Add("cn");

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

بالنسبة لأولئك unsing C# هنا ActionAttribute أن يعود 400 بدلا من 401, ، 'يبتلع' الأساسية المصادقة الحوار.

public class NoBasicAuthDialogAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new HttpStatusCodeResult(400);
    }
}

استخدام مثل التالية:

[NoBasicAuthDialogAuthorize(Roles = "A-Team")]
public ActionResult CarType()
{
 // your code goes here
}

نأمل أن يكون هذا يوفر لك بعض الوقت.

أنا باستخدام عقدة ، Express & جواز السفر و كانت تعاني نفس المشكلة.أنا حصلت على العمل صراحة وضع www-authenticate رأس إلى سلسلة فارغة.في حالتي, انها تبدو مثل هذا:

(err, req, res, next) => {
  if (err) {
    res._headers['www-authenticate'] = ''
    return res.json(err)
  }
}

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

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