Невозможно добавить заголовок WS-Security к запросу, созданному из веб-ссылки - PullRequest
0 голосов
/ 12 июня 2019

Я использовал WebReference, а принимающему серверу требуется заголовок WS-Security:

<wsse:UsernameToken wsu:Id="Example"> 
    <wsse:Username> ... </wsse:Username>
    <wsse:Password Type="..."> ... </wsse:Password>
    <wsse:Nonce EncodingType="..."> ... </wsse:Nonce>
    <wsu:Created> ... </wsu:Created>
</wsse:UsernameToken>

Я предполагал, что это будет включено в WSDL, однако после прочтения этого поста Я понимаю, что логика должна быть отделена.

Класс клиента, который я использую для выполнения запроса, содержит свойство Proxy IWebProxy:HttpWebClientProtocol.Я считаю, что именно здесь я должен предоставить информацию заголовка / переопределения.Кто-нибудь может подтвердить это?

У меня также есть код, который, как я знаю, генерирует правильные заголовки.Однако я не уверен, как указывать эти заголовки / элементы без изменения WebReference.

public static Tuple<EndpointAddress, BindingElementCollection, string, string> PrepareGlowsAuth(string endpoint)
{
    EndpointAddress soapEndpoint = new EndpointAddress(string.Format("{0}/{1}", (IsProduction ? productionBaseUrl : testingBaseUrl), endpoint));
    BasicHttpsBinding binding = new BasicHttpsBinding();
    binding.Security.Mode = BasicHttpsSecurityMode.TransportWithMessageCredential;
    binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

    BindingElementCollection elements = binding.CreateBindingElements();
    elements.Find<SecurityBindingElement>().EnableUnsecuredResponse = true;

    return new Tuple<EndpointAddress, BindingElementCollection, string, string>(soapEndpoint, elements, "username", "password");
}

Был бы признателен, если бы кто-то мог указать мне правильное направление!

Обновление: послеСледуя совету, я не вижу классов Клиента или Ответа.

Image to show the classes arent defined

1 Ответ

1 голос
/ 13 июня 2019

Способ ввода учетных данных в запрос без изменения класса клиента выглядит следующим образом:

// Assume that you named your "Connected Service" com.example.foo

foo.bar requestObj= new foo.bar();

// Fill in your request object
bar.FirstName = "Someone";
// etc.

// Set up the authentication using the function you provided
var glowsAuthData = PrepareGlowsAuth("expressRateBook");

// foo.<object name>Client is automatically created, this is the generated
//   proxy class for communicating with the intended web service
foo.barClient client = new foo.barClient(new CustomBinding(glowsAuthData.Item2)
                                         , glowsAuthData.Item1);
client.ClientCredentials.UserName.UserName = glowsAuthData.Item3;
client.ClientCredentials.UserName.Password = glowsAuthData.Item4;

// Use the client to send the request object and populate the response object
// foo.<object name>Response is automatically generated when VS generates 
//   the code for "Connected Service". It also makes it the return type 
//   for foo.barClient.barResponse(foo.bar);
foo.barResponse responseObj = client.barResponse(requestObj);

Если не делать исключений, responseObj будет содержать ответ от сервера.Прямое изменение сгенерированного клиента, созданного с использованием WSDL, не требуется.

...