У меня есть клиент 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, устанавливающий во входе диагностики, но информация о безопасности остается затененной. Какие-либо идеи о той?
Я могу подтвердить, что ОБНОВЛЕНИЕ из моего вопроса действительно работает:
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 /
Недавно у меня была похожая проблема, и я отказался от поиска решения, отличного от 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();