كيف يمكنني المصادقة باستخدام بيانات اعتماد العميل في WCF مرة واحدة فقط؟

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

سؤال

ما هو أفضل أسلوب للتأكد من أنك تحتاج إلى المصادقة مرة واحدة فقط عند استخدام واجهة برمجة التطبيقات (API) المبنية على WCF؟

الارتباطات والسلوكيات الحالية الخاصة بي مدرجة أدناه

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>

التالي هو ما أستخدمه في تطبيق العميل الخاص بي للمصادقة (حاليًا يجب أن أفعل ذلك في كل مرة أرغب في إجراء مكالمة إلى WCF)

Dim client As ProductServiceClient = New ProductServiceClient("wsHttpProductService")
client.ClientCredentials.UserName.UserName = "foo"
client.ClientCredentials.UserName.Password = "bar"
Dim ProductList As List(Of Product) = client.GetProducts()

ما أود القيام به هو المصادقة باستخدام واجهة برمجة التطبيقات (API) بمجرد استخدام بيانات الاعتماد هذه، ثم الحصول على نوع من الرمز المميز للفترة الزمنية التي يستخدم فيها تطبيق العميل الخاص بي مشروع خدمة الويب.اعتقدت أن إنشاءsecuritycontext=true هل فعل هذا من أجلي؟

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

المحلول

إذا كنت تستخدم شبكة إنترانت، فيمكن التعامل مع مصادقة Windows "مجانًا" عن طريق التكوين وحده.

إذا لم يكن هذا مناسبًا، فإن خدمات الرمز المميز تعمل بشكل جيد، ولكن في بعض المواقف قد تكون أكثر من اللازم.

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

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

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

نصائح أخرى

على الرغم من أنني أكره إعطاء إجابة لست متأكدًا منها بنسبة 100%، إلا أن قلة الإجابات حتى الآن تجعلني أعتقد أن الإجابة الصحيحة المحتملة قد تكون مقبولة في هذه الحالة.

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

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

إذا كنت تريد المزيد من التفاصيل، فيرجى الصراخ، ولكني أظن أن مدونة بابلو ستحتوي على معلومات أكثر من كافية لتتمكن من المضي قدمًا.

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