Проблема с аутентификацией на Java WS - PullRequest
0 голосов
/ 20 декабря 2009

У меня есть приложение на C #, которое использует Java WS. Все работало нормально, пока WS не был настроен на использование аутентификации. Теперь я должен ввести логин и пароль для запуска методов из WS, но я не уверен, как это сделать. Я попробовал

var client = new MyBeanClient();
                    client.ClientCredentials.UserName.UserName = "admin";
                    client.ClientCredentials.UserName.Password = "";
                    client.addConsumer("whatever", "", "", "");

Но я получаю SecurityMessageException - {"HTTP-запрос не авторизован с клиентом Схема аутентификации «Аноним». Заголовок аутентификации, полученный от сервер был «Согласовать, NTLM». "} InnerException - (WebException) - {"Удаленный сервер возвратил ошибку: (401) Несанкционировано. "}.

Что не так?

Спасибо

1 Ответ

0 голосов
/ 20 декабря 2009

Попробуйте это:

var credentialCache = new CredentialCache();
var credentials = new NetworkCredential("username", "password", "domain");
credentialCache.Add(new Uri(client.Url), "NTLM", credentials);
client.Credentials = credentialCache;
client.addConsumer("whatever", "", "", "");

UPDATE:

Извините, в моем первом посте я подумал, что вы используете wsdl.exe для генерации прокси клиента Для клиента WCF необходимо настроить конечную точку:

var basicHttpBinding = new BasicHttpBinding();
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
var endpoint = new EndpointAddress("http://example.com/myWindowsAuthN");
var client = new MyBeanClient(basicHttpBinding, endpoint);
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

client.ChannelFactory.Credentials.Windows.ClientCredential.Domain = "domain";
client.ChannelFactory.Credentials.Windows.ClientCredential.UserName = "username";
client.ChannelFactory.Credentials.Windows.ClientCredential.Password = "password";


UPDATE2:

Я использовал следующую конфигурацию для вызова веб-сервисов, защищенных аутентификацией NTLM. В app.config клиента поставьте следующее:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="NtlmBinding">
        <security mode="TransportCredentialOnly">
          <transport clientCredentialType="Ntlm" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
  <client>
    <endpoint
      address="http://example.com/SomeWindowsAuthenticatedService"
      binding="basicHttpBinding"
      bindingConfiguration="NtlmBinding"
      contract="IOperationContractOfTheService"
      name="WSTestSoap" />
  </client>
</system.serviceModel>

и затем вы можете установить соответствующие учетные данные перед вызовом метода:

using (var client = new MyBeanClient())
{
    client.ChannelFactory.Credentials.Windows.ClientCredential = 
        new NetworkCredential("username", "password", "DOMAIN");
    client.addConsumer("whatever", "", "", "");
}
...