إضافة الصابون: اسم مستخدم الرأس وكلمة المرور مع WSE 3.0

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

سؤال

لقد نجحت في إنشاء عميل WS يعمل بشكل صحيح عند عدم استخدام المصادقة.

ومع ذلك ، يتطلب الخادم (WebSphere) الآن إضافة رمز اسم مستخدم WS-Security ، وأنا أواجه صعوبة في القيام بذلك. من المفترض أن تبدو رسالة الصابون الناتجة مثل هذا:

<soapenv:Envelope 
  xmlns:ns="http://foo.bar/1.0"
  xmlns:ns1="http://www.witsml.org/schemas/140"   
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

  <soapenv:Header>

    <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:UsernameToken wsu:Id="UsernameToken-2" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:Username>foo</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bar</wsse:Password>    
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">foooooobar==</wsse:Nonce>
        <wsu:Created>2010-01-25T13:09:24.860Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>

  </soapenv:Header>

  <soapenv:Body>
    <ns:fooBar>...</ns:fooBar>
  </soapenv:Body>

لقد قمت بتنزيل وتثبيت WSE 3.0 SDK من Microsoft وأضفت إشارة إلى DLL في مشروع Visual Studio 2005 الخاص بي.

لدي الآن إمكانية الوصول إلى Microsoft.web.services3.* مساحات الأسماء ، لكنني حاليًا متعثر حول كيفية المتابعة.

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

WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.Url = "http://foo.bar.baz";
ws.SendSomething(message);

لقد بدأت للتو في التحقيق باستخدام Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, ، لكن حتى الآن لم أتمكن من الحصول على أي شيء.

ستكون أي تلميحات موضع تقدير كبير ، حيث لا يمكنني العثور على أي وصفات جيدة على الشبكة.

شكرًا!

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

المحلول 2

حصلت عليها ، لسوء الحظ قبل القراءة إجابة Wsanville الرائعة.

لمساعدة الآخرين ، أقوم بنشر جميع الخطوات التي كنت بحاجة للقيام بها للحصول على العمل مع Visual Studio 2005:

  • تثبيت WSE 3.0, ، يختار العادة واختر كل شيء
  • اقرأ تنفيذ المصادقة المباشرة مع رمز اسم المستخدم في WSE 3.0 للتلميحات
  • إعادة تشغيل Visual Studio 2005 ، انقر بزر الماوس الأيمن الآن على مشروعك في Explorer ، ويجب أن يكون لديك ملف إعدادات WSE 3.0 عنصر القائمة واستخدم ذلك إذا كنت تريد ذلك.
  • تحديث مراجع الويب الخاصة بك ، يجب أن ينشئ ذلك فئة جديدة من وكيل خدمة الويب HTTP ، باسم مختلف ، على سبيل المثال YourWsNameHttpServiceWse. هذا هو نفسه الجري بشكل أساسي wsewsdl3.exe
  • استخدم هذه الفئة الجديدة ، ويجب أن تتمكن من الوصول إلى أساليب وخصائص WSE ، مثل SetClientCredential.

انتهى بي الأمر إلى القيام بكل شيء تقريبًا في التعليمات البرمجية ، بدلاً من الاعتماد على ملفات التكوين التي تم تصميمها باستخدام C# DLL. انتهى الرمز إلى أن يبدو مثل هذا:

FooBarHttpServiceWse wse = new FooBarHttpServiceWse();

wse.SetClientCredential(new UsernameToken(
    "username",
    "password",
    PasswordOption.SendPlainText));

wse.SetPolicy(new FooBarPolicy());
wse.CallSomeServerFunction(yourRequest)

لقد خلقت سياستي الخاصة ، والتي بدت هكذا:

using Microsoft.Web.Services3.Design;

// ...

public class FooBarPolicy : Policy
{
    public FooBarPolicy()
    {
        this.Assertions.Add(new UsernameOverTransportAssertion());
    }
}

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

حاولت عبثا لتعيين wsa:Action عنصر نفسي:

using Microsoft.Web.Services3.Addressing;

// ...

wse.RequestSoapContext.Addressing.Action = new Action("CallSomeServerFunction");

كانت المشكلة أنه حتى لو قمت بتعيين إجراء ، عندما تم إرساله عبر السلك ، كان فارغًا. اتضح أنه اضطررت إلى فتح فئة WSE Proxy وتحرير سمة هناك:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute(
    "---Edit this to set wsa:Action---", 
    Use=System.Web.Services.Description.SoapBindingUse.Literal, 
    ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
// ...
public SomeServerFunction(...)

بعد ذلك ، كل شيء نجح بشكل جيد.

نصائح أخرى

تأكد من أن فصل الوكيل الخاص بك يرث من Microsoft.Web.Services3.WebServicesClientProtocol.

يمكنك القيام بذلك إما عن طريق تغيير فئة الوكيل نفسها ، أو عن طريق توليده عبر سطر الأوامر باستخدام wsewsdl3.exe مع ال /type:webClient تحول.

يمكنك بعد ذلك تمرير بيانات الاعتماد مثل هذا:

using Microsoft.Web.Services3;
using Microsoft.Web.Services3.Security.Tokens;
using Microsoft.Web.Services3.Security;
.
.
.
WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.RequestSoapContext.Security.Tokens.Add(new UsernameToken("blah", "blah", PasswordOption.SendPlainText));

هذا ما فعلته في الماضي للحصول على WSE3.0 في الاستوديو 2008. نأمل أن يساعد ذلك.

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