Ошибка в клиенте WCF, использующем Ось 2 веб-сервиса со схемой аутентификации WS-Security UsernameToken PasswordDigest

У меня есть клиент WCF, соединяющийся с Java базирующийся веб-сервис Axis2 (вне моего управления). Это собирается относиться к безопасности WS это, и я должен зафиксировать клиент.NET. Однако я изо всех сил пытаюсь обеспечить корректную аутентификацию. Я знаю, что WSE 3.0 мог бы помочь, но я предпочту не возвращаться к устаревшей технологии.

Подобные (нерешенные) проблемы, включайте это, это и это.

Сообщение SOAP должно быть похожим на это:


   
   
   
  2010-05-28T12:50:33.675+01:00 

Однако мой похож на это:





2010-06-23T10:31:23.441Z
2010-06-23T10:36:23.441Z











Мой клиент похож на это: P.S. Отметьте необходимый SecurityHeaderType param.Что это?

public MyAck SendRequest(MyRequest request)
{
 RemoteServicePortTypeClient client = new RemoteServicePortTypeClient();

 client.ClientCredentials.UserName.UserName = "JAY";
 client.ClientCredentials.UserName.Password = "AND";

    // what is the difference between the two different Credential types??
    //client.ClientCredentials.HttpDigest.ClientCredential.UserName = "SILENT";
    //client.ClientCredentials.HttpDigest.ClientCredential.Password = "BOB";

 SecurityHeaderType sht = new SecurityHeaderType();
 //sht.Any = ???; // How do I use this???
 //sht.AnyAttr = ???; // How do I use this ???

 // SecurityHeaderType is a required parameter
 return client.RemoteServiceOperation_Provider(sht, request);
}

Текущая привязка следующие:


    
        
            
            
        
    

Я также попробовал пользовательскую привязку и получил подобную ошибку:


  
    
    
    
  

И конечная точка (Адрес, очевидно, измененный...):


Пользовательская ошибка, которая возвращается, следующие:

0
UNEXPECTED

2010-06-23T13:28:54Z

Я считал партии о пользовательских заголовках, маркеры, привязка и мой мозг полностью перепутан. Кто-либо может предложить пошаговый процесс для отправки сообщения в правильном формате?

Это, кажется, путь вперед к WCF, с помощью пользовательских маркеров, но как нужно применить обзор и данный случай как требуется?

Любая справка одобрена.

ОБНОВЛЕНИЕ

Я имел некоторый ограниченный успех. Я использовал Microsoft. Сеть. Библиотека Services3 для создания UsernameToken с корректным обзором. Я затем создал свое собственное поведение, и в методе BeforeSendRequest я сделал следующее для введения заголовка:

object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
    UsernameToken ut = new UsernameToken("USERNAME", "PASSWORD", PasswordOption.SendHashed);

    XmlElement securityElement = ut.GetXml(new XmlDocument());

    MessageHeader myHeader = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", securityElement, false);
    request.Headers.Add(myHeader);

    return Convert.DBNull;
}

Я добавляю поведение как так:

CustomBehavior behavior = new CustomBehavior("USERNAME", "PASSWORD");
client.Endpoint.Behaviors.Add(behavior);

Я могу теперь видеть, что заголовки идут через:













2010-06-24T16:23:58Z



Но я получаю ошибку:


soapenv:Server
WSDoAllReceiver: security processing failed; nested exception is: 
    org.apache.ws.security.WSSecurityException: General security error (WSSecurityEngine: Callback supplied no password for: USERNAME)
urn:Remote_Provider


0
UNEXPECTED

2010-06-24T17:23:59Z



На узле пароля, кажется, существует недостающий Атрибут типа:

Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"

Однако я не уверен, является ли безопасность прослеживающие и регистрирующиеся настройки общим удалением атрибутов и содержания тех узлов. Я попытался использовать logKnownPii, устанавливающий во входе диагностики, но информация о безопасности остается затененной. Какие-либо идеи о той?

13
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Я могу подтвердить, что ОБНОВЛЕНИЕ из моего вопроса действительно работает:

object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
    UsernameToken ut = new UsernameToken("USERNAME", "PASSWORD", PasswordOption.SendHashed);

    XmlElement securityElement = ut.GetXml(new XmlDocument());

    MessageHeader myHeader = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", securityElement, false);
    request.Headers.Add(myHeader);

    return Convert.DBNull;
}

И клиент:

CustomBehavior behavior = new CustomBehavior("USERNAME", "PASSWORD");
client.Endpoint.Behaviors.Add(behavior);

Сообщение об ошибке не было связано. Заголовок безопасности работает с очень простым basicHttpBinding:

<basicHttpBinding>
  <binding name="BasicSOAPBinding">
      <security mode="Transport" />
  </binding>
</basicHttpBinding>

Пример кода этого в действии можно найти в моем блоге: http://benpowell.org/supporting-the-ws-i-basic-profile-password -digest-in-a-wcf-client-proxy /

5
ответ дан 2 December 2019 в 01:41
поделиться

Недавно у меня была похожая проблема, и я отказался от поиска решения, отличного от WSE. Спустя пару дней я закончил загрузку WSE 3.0 SDK, сгенерировал прокси-класс с помощью WseWsdl3.exe и создал новую политику для UsernameToken. Я был готов к работе за 15 минут. Следующее сейчас работает для меня.

RemoteService service = new RemoteService();  //generated class

UsernameToken token = new UsernameToken(username, password, PasswordOption.SendPlainText);
Policy policy = new Policy();
policy.Assertions.Add(new UsernameOverTransportAssertion());

service.SetClientCredential(token);
service.SetPolicy(policy);

var result = service.MethodCall();
1
ответ дан 2 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: