كيفية تكوين خدمات RESTful الآمنة مع WCF باستخدام اسم المستخدم/كلمة المرور + SSL

StackOverflow https://stackoverflow.com/questions/141484

سؤال

إنني أتطلع إلى كتابة ملف تكوين يسمح بخدمات RESTful في WCF، ولكني ما زلت أريد القدرة على "الاستفادة من" موفر العضوية لمصادقة اسم المستخدم/كلمة المرور.

ما يلي هو جزء من التكوين الحالي الخاص بي باستخدام ربط basicHttp أو wsHttp w/out WS Security، كيف سيتغير هذا مع الخدمات المستندة إلى REST؟

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/>
                </security>
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding name="basicHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
هل كانت مفيدة؟

المحلول 7

تحديث 23/01/2012

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

يتطلب استخدام المفاتيح العامة/الخاصة.

1.) سيحتاج كل مستخدم (عميل) لنقطة النهاية إلى التسجيل في خدمة الويب REST الخاصة بك

  • أ.) أنت تعطي هذا المستخدم مفتاحًا خاصًا لا ينبغي مشاركته مع أي شخص
  • ب.) يمكنك أيضًا إنشاء مفتاح عام يمكن أن يتجاوز السلك في نص عادي إذا لزم الأمر (سيتم استخدام هذا أيضًا لتحديد العميل)

2.) يحتاج كل طلب من المستخدم إلى إنشاء تجزئة لتوقيع الطلب

  • أ.) قد يبدو أحد الأمثلة على ذلك كما يلي:مفتاح خاص + طابع زمني + حمولة مشفرة (إذا كانت صغيرة بما يكفي مثل معلومات مستخدم بسيطة ليتم تحديثها على سبيل المثال)
  • ب.) تأخذ هذه العناصر الثلاثة (أو أيًا كان ما قررته) وتقوم بإنشاء تجزئة ذات اتجاه واحد (باستخدام hmac على سبيل المثال)
  • ج.) في الطلب الذي يتم إرساله عبر السلك، عليك تضمين المفتاح العام (حتى يعرف جانب الخادم من يحاول إرسال هذا الطلب)، والتجزئة التي تم إنشاؤها باستخدام المفتاح الخاص، والطابع الزمني.

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

  • أ) ابحث عن المفتاح الخاص للعملاء من خلال المفتاح العام الذي يتم تمريره أثناء الطلب

  • ب.) خذ المعلمات الأخرى (الطابع الزمني والحمولة المشفرة) جنبًا إلى جنب مع المفتاح الخاص الذي وجدته في الخطوة السابقة واستخدم نفس الخوارزمية لإنشاء تجزئة أحادية الاتجاه (مرة أخرى، hmac هو ما رأيته مستخدمًا في العالم الحقيقي )

  • ج.) يجب أن تتطابق التجزئة ذات الاتجاه الواحد الناتجة مع التجزئة المرسلة عبر السلك، إذا لم يتم إرسالها مرة أخرى 400 (أو أي رمز http تعتبره "طلبًا سيئًا")

نصائح أخرى

إليك بودكاست حول تأمين خدمات WCF REST مع موفر عضوية ASP.net:

http://channel9.msdn.com/posts/rojacobs/endpointtv-Securing-RESTful-services-with-ASPNET-Membership/

أتفق مع داريل على أن سيناريوهات REST المعقدة عبر WCF فكرة سيئة.انها ليست جميلة.

ومع ذلك، دومينيك باير لديه بعض مشاركات جيدة حول هذا على مدونته الأقل امتيازًا.

إذا كنت ترغب في رؤية دعم مصادقة WSSE مع الرجوع إلى دعم FormsAuthenticationTicket على WCF، فراجع كود المصدر لخدمة BlogService.

قبل الاستمرار في هذا المسار من القتال لتنفيذ REST عبر WCF، أقترح عليك القراءة هذا مشاركة من تيم ايوالد.لقد تأثرت بشكل خاص بالبيان التالي:

لست متأكدًا من أنني أرغب في البناء على طبقة مصممة لعوامل HTTP في أعلى طبقة تم تصميمها لتوضيحها.

لقد أمضيت الـ 12 شهرًا الماضية في تطوير الأشياء المستندة إلى REST باستخدام WCF وقد أثبت هذا البيان صحته مرارًا وتكرارًا.IMHO ما يقدمه WCF إلى الطاولة يفوقه التعقيد الذي يقدمه للقيام بعمل REST.

بغض النظر عما إذا كان لدى المجتمع آراء ضد REST في WCF (أنا شخصيا على الحياد) وقد اتخذت مايكروسوفت انتقادا شديدا في ذلك، http://msdn.microsoft.com/en-us/netframework/cc950529.aspx

نعم، تم الاتفاق مع Moto، الرابط الموجود خارج WCF Starter Kit هو أقرب شيء رأيته لمصادقة بيانات الاعتماد باستخدام رأس HTTP مخصص (http://msdn.microsoft.com/en-us/library/dd203052.aspx).

ومع ذلك لم أتمكن من الحصول على المثال.

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