سؤال

وأنا أبحث عن بعض التفاصيل التقنية على حيث يتم تخزين اسم المستخدم الفعلي + (أوراق) كلمة خلال تبادل الرسائل باستخدام WCF ملزمة مثل أدناه.

<bindings>
    <wsHttpBinding>
        <binding name="wsHttp">
            <security mode="TransportWithMessageCredential">
                <transport/>
                <message clientCredentialType="UserName" 
                         negotiateServiceCredential="false" 
                         establishSecurityContext="true" />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

وبعد ذلك داخل التطبيق العميل أدعو هذه الخدمة تمرير مجموعة صالحة من creds مثل ذلك

using (SupplierServiceClient client = new SupplierServiceClient()) {
            client.ClientCredentials.UserName.UserName = "admin";
            client.ClientCredentials.UserName.Password = "password";

            SupplierList = client.GetSupplierCollection();
}

في البداية افترضت أن WCF تم أخذ هذه البيانات ووضعه في رأس SOAP ولكن لا يبدو أن الطريق من WSDL ... أي مساعدة؟

تعديل : في

وأدناه هو ما تكوين الأمان للعميل يشبه في الإنتاج

<security mode="TransportWithMessageCredential">
    <transport clientCredentialType="None" />
    <message clientCredentialType="UserName" establishSecurityContext="false" />
</security>
هل كانت مفيدة؟

المحلول

ومن خلال تحديد UserNameCredentials كنت في الواقع الاستفادة من اسم المستخدم رمز الملف. يؤدي هذا المنوال إلى أن تضاف إلى الرسالة كما رأس SOAP. ورأس SOAP ننظر بشيء من هذا القبيل:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
        xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <env:Header>
        <wsse:UsernameToken>
            <wsse:Username>jdoe</wsse:Username>
            <wsse:Password>passw0rd</wsse:Password>
            <wsse:Nonce><!-- optional nonce here --></wsse:Nonce>
        </wsse:UsernameToken>
    </env:Header>
    <env:Body>
        <!-- body here -->
    </env:Body>
</env:Envelope>

والآن، وأنا لست متأكدا بالضبط ماذا كنت بالذكر WSDL. لن يظهر الرمز في اختصار، على الرغم من أن WSDL يجب أن يحتوي على annontations WS-سياسة مناسبة في العملية. وهذا من شأنه السماح للمستهلكين من WSDL يكتشف أنهم فعلا بحاجة لإرسال في UsernamePasswordToken على هذا الطلب.

وأخيرا، جلب شخص ما RequestSecurityToken (RST)، ولكن هناك لا ينبغي أن (الحاجة إلى) أن يكون RST إينفوليد إذا كنت فقط باستخدام مصادقة UsernameToken بسيطة. المرة الوحيدة على RST يحتاج إلى أن يشارك هو إذا كنت تفعل تبادل رمزي مع ملقم علامة آمنة (STS) باستخدام WS-الاستئماني.

نصائح أخرى

وهنا كيف يمكن لرسالة SOAP عينة قد تبدو:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>
    <a:MessageID>urn:uuid:01d3a7d2-dc5a-42cf-acf0-3dd6bd50230e</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1">http://localhost:9999/Service1.svc</a:To>
  </s:Header>
  <s:Body>
    <t:RequestSecurityToken Context="uuid-7c240c06-c14b-42af-82dd-10f44f423928-1" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">
      <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType>
      <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType>
      <t:KeySize>256</t:KeySize>
      <t:BinaryExchange ValueType="http://schemas.xmlsoap.org/ws/2005/02/trust/spnego" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">YGsGBisGAQUFAqBhMF+gJDAiBgorBgEEAYI3AgIKBgkqhkiC9xIBAgIGCSqGSIb3EgECAqI3BDVOVExNU1NQAAEAAAC3shjiBgAGAC8AAAAHAAcAKAAAAAUBKAoAAAAPU0cyMjA1Nk1BVE1VVA==</t:BinaryExchange>
    </t:RequestSecurityToken>
  </s:Body>
</s:Envelope>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top