Разработка клиента .NET, который использует безопасный веб-сервис METRO 2.1 - PullRequest
1 голос
/ 03 апреля 2011

У меня есть защищенный веб-сервис METRO 2.1, и я хочу разработать клиент .NET (3.5), который сможет его использовать.Я уже преуспел, если WS не был защищен, но как только я получил

Механизм безопасности Username Authentication with Symmetric Key и он использует Development Defaults

Как настроить безопасность в .NET?Я читал руководство METRO, но я нашел только неработающие ссылки на примеры, и руководства не помогли мне.Я успешно сгенерировал прокси-класс с svcutil, но не знаю, как его использовать.

svcutil предупреждений:

Предупреждение 1 Предупреждение о пользовательском инструменте: политика безопасности былаимпортируется для конечной точки.Политика безопасности содержит требования, которые не могут быть представлены в конфигурации Windows Communication Foundation.Найдите комментарий о параметрах SecurityBindingElement, которые требуются в созданном файле конфигурации.Создайте правильный элемент привязки с кодом.Конфигурация привязки, которая находится в файле конфигурации, небезопасна.

Предупреждение 2 Предупреждение пользовательского инструмента: элемент wsam: Addressing требует дочернего элемента wsp: Policy, но не имеет дочерних элементов.

РЕДАКТИРОВАТЬ

Я действительно близок к решению этого (я думаю).Я экспортировал сертификат GlassFish по умолчанию с keytool.exe:

keytool -exportcert -alias xws-security-server -storepass changeit -keystore keystore.jks -file server.cer 
keytool -printcert -file server.cer //This line shows it's content

Я использую server.cer сертификат на стороне клиента:

KDTreeWSClient wsClient = new KDTreeWSClient();
X509Certificate2 server_cert = new X509Certificate2("FullPathToCertificate/server.cer", "changeit");
wsClient.ClientCredentials.ServiceCertificate.DefaultCertificate = server_cert;
wsClient.ClientCredentials.UserName.UserName = "wsitUser"; //Default GF username
wsClient.ClientCredentials.UserName.Password = "changeit"; //Default GF password

Вопрос Это приводит кMessageSecurityException, поскольку ожидаемый DNS-идентификатор конечной точки равен localhost, однако конечная точка имеет xwssecurityserver.Могу ли я установить localhost / xwssecurityserver вручную?

Буду признателен за любую помощь!Заранее спасибо, Даниэль

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

попробуйте установить идентификатор DNS в файле конфигурации клиентского приложения, как описано ниже

      <endpoint address="http://localhost:8080/SecureCalculatorApp/CalculatorWSService"
          binding="customBinding" bindingConfiguration="CalculatorWSPortBinding1"
          contract="ServiceReference3.CalculatorWS" name="CalculatorWSPort1">
        <identity>
          <dns value="{YOUR ALIAS}" />
        </identity>
      </endpoint>

В качестве значения dns установите "xwssecurityserver".В моем случае это работает (кстати, я использовал ваш вопрос в качестве основы, когда решил эту проблему, так что спасибо, что указали правильный путь :))

0 голосов
/ 08 апреля 2011

Вот как я настроил клиента:

Uri uri = new Uri("http://localhost:8080/JavaWSJMX/KDTreeWSService");
X509Certificate2 server_cert = new X509Certificate2("C:/../server.cer", "changeit"); //Second param is the certificate's password
AddressHeader[] ah = new AddressHeader[0];
EndpointAddress ea = new EndpointAddress(uri, EndpointIdentity.CreateX509CertificateIdentity(server_cert), ah);
KDTreeWSClient wsClient = new KDTreeWSClient("KDTreeWSPort", ea);

Где KDTreeWSPort - это endpointConfigurationName, которое вы можете получить от вашего .config:

<client>
  <endpoint address="http://localhost:8080/JavaWSJMX/KDTreeWSService"
    binding="customBinding" bindingConfiguration="KDTreeWSPortBinding"
    contract="KDTreeWS" name="KDTreeWSPort" />
</client>

Послеэто вы должны установить ClientCredentials:

//The server uses this certificate
wsClient.ClientCredentials.ServiceCertificate.DefaultCertificate = server_cert;
//These are the default credentials on GlassFish v3.1
wsClient.ClientCredentials.UserName.UserName = "wsitUser";
wsClient.ClientCredentials.UserName.Password = "changeit";

И вы сможете позвонить в свой веб-сервис METRO!Я использую Proxy-класс, сгенерированный с помощью svcutil, поэтому я не создал ServiceReference.

0 голосов
/ 06 апреля 2011

На самом деле я не думаю, что это ваша проблема, но она может помочь устранить некоторые из предупреждений, которые вы получаете.Второе сообщение выглядит смутно знакомым.У нас был клиент SOAP 1.1, говорящий с Java WS, который выставлял исключение пользовательской ошибки.Когда произошла ошибка службы Java, она добавила трассировку стека к ошибке, и наш клиент .NET лопнул, потому что он не поддерживал несколько дочерних элементов, только службы SOAP 1.2.Поговорив с нашей командой разработчиков Java, они обнаружили, что в Tomcat есть параметр отладки (или в Java, я не могу вспомнить, какой), который позволил вам включить его, поэтому трассировка стека не была включена.После этого ошибки были правильно распространены.Извините, больше не могу помочь, но это может помочь.

...