الاتصال مع WCF إلى خدمة ويب مع مصادقة المستخدم/كلمة المرور

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

سؤال

أنا خلقت وكيل خدمة ويب في Visual Studio 2008, وقد خلقت لي الإدخال التالي في التطبيق.التكوين:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="MyNameHandlerSoapBinding" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://www.***/***/***"
              binding="basicHttpBinding" bindingConfiguration="MyNameHandlerSoapBinding"
              contract="***.MyNameHandler" name="MyName">
          </endpoint>
        </client>
    </system.serviceModel>

خدمة ويب هو اسم المستخدم/كلمة المرور مصادقة لذا أريد أن أضيف أنه في مكان ما هنا.

أنا فقدت قليلا في بحر من صندوق رأس المال العامل الوثائق ، أعتقد أنه يجب أن تتغير من basicHttpBinding إلى wsHttpBinding أو customBinding أن تكون قادرا على إضافة المصادقة العناصر, ولكن أنا حقا لا أفهم ذلك.يمكن لأي شخص أن تعطي أي نصيحة سريعة أو أي وصلة مفيدة أن يقول كيف ذلك ؟

تحرير:

لقد غيرت القسم:

<security mode="Transport">
    <transport clientCredentialType="Basic" proxyCredentialType="None"
         realm="" />
</security>

وأضاف في المدونة:

ws.ClientCredentials.UserName.UserName = "";
ws.ClientCredentials.UserName.Password = "";

الآن يبدو أنه قد يكون باستخدام بيانات الاعتماد لكنه يعطيني خطأ:

المقدمة URI مخطط 'http' غير صالح URI المتوقع 'https'

أنا حتى لا أعرف إذا كان هذا هو الطريق الصحيح للذهاب...

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

المحلول

أنشر هنا الحل في المستقبل القراء:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MyHandlerSoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic"  />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://www.***/***/***/MyHandler"
          binding="basicHttpBinding" bindingConfiguration="MyHandlerSoapBinding"
          contract="***.MyHandler" name="MyHandler">
      </endpoint>

    </client>
  </system.serviceModel>

في النهاية يمكنني استخدام الافتراضي basicHttpBinding.الفرق الوحيد من قانون نشر في السؤال هو الأمن عقدة.

نلاحظ أيضا النمط="TransportCredentialOnly" الخيار هذا يسمح لك بإرسال اسم المستخدم/كلمة المرور باستخدام http بدلا من https.وهذا أمر ضروري من أجل بيئات اختبار واحد أنا باستخدام.في وقت لاحق من الواضح أنك سوف تفضل https إرسال بيانات الاعتماد الخاصة بك.

بعد ذلك في التعليمات البرمجية سوف أدخل اسم المستخدم الخاص بك/كلمة المرور:

var ws = new ***.MyHandlerClient("MyHandler");
ws.ClientCredentials.UserName.UserName = "myUsername";
ws.ClientCredentials.UserName.Password = "myPassword";
var result = ws.executeMyMethod();

نصائح أخرى

رسالة الخطأ هو الحق.صندوق رأس المال العامل لا تسمح نقل أسماء المستخدمين وكلمات السر على غير محمية البروتوكول.خدمة الويب الخاص بك يجب أن تستخدم HTTPS (مع ما يصاحب ذلك من شهادة SSL)

مرة واحدة لديك شهادة SSL لديك اثنين من الخيارات بشأن كيفية إرسال أوراق اعتماد النقل أو الأمن وخيارات متعددة لهذا النوع من الاعتماد.MSDN لديه دليل جيد إلى كل من الخيارات المختلفة.

كان عندي نفس المشكلة وجربت الحل أعلاه بطريقة ما لم يكن هذا العمل بالنسبة لي لقد كان الحفاظ على الحصول على رسالة "لا WS-الأمن رأس وجدت"

بعد وقت طويل من التجارب ومحاولة تمكنت من الحصول على هذا العمل أضفت رأس رمز العميل على النحو التالي ومن ثم يعمل!

<client>
    <endpoint address="http://your.service.com" binding="basicHttpBinding" bindingConfiguration="XXXBinding" contract="contract.XXX" name="XXXPort">
        <headers xmlns:wsse="http://your.xsd">
            <wsse:Security mustUnderstand="1">
                <wsse:UsernameToken>
                    <tenant>XXX</tenant>
                    <wsse:Username>XXX</wsse:Username>
                    <wsse:Password Type="http://www.xxxx.com/wss#PasswordText">XXX</wsse:Password>
                </wsse:UsernameToken>
            </wsse:Security>
        </headers>
    </endpoint>
</client>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top