WCF эквивалент веб-ссылки (Kerberos & WebGate) - PullRequest
2 голосов
/ 09 января 2012

Надеюсь, вы мне чем-нибудь поможете. Я пытаюсь заставить мой вызов WCF на стороне клиента вести себя точно так же, как веб-ссылка, которая у меня работает правильно.

Веб-код ссылки:

Dim wsProxy As New Namespace.ServiceName()
wsProxy.Credentials = CredentialCache.DefaultCredentials
wsProxy.CookieContainer = New CookieContainer()
wsProxy.AllowAutoRedirect = True
wsProxy.WebMethod()

Красиво и просто. На мой взгляд, эквивалент WCF должен быть:

Dim binding As New BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly)
binding.Security.Tranport.ClientCredentialType = HttpClientCredentialType.Windows
Dim wsProxy As New Namespace.ServiceName(binding, New EndpointAddress("..."))
wsProxy.ClientCredentials.Windows.AllowNtlm = False
wsProxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification
wsProxy.ChannelFactory.Credentials.Windows.ClientCredential = Net.CredentialCache.DefaultCredentials
wsProxy.WebMethod()

Независимо от того, что я пытаюсь, я не могу получить эквивалент WCF для аутентификации. Я всегда получаю:

"HTTP-запрос не авторизован с помощью схемы аутентификации клиента« Согласование ». Заголовок аутентификации, полученный от сервера, был« Согласование, базовая область = «Моя область» ».»

Ключевые критерии:

  • Требуется аутентификация с использованием Kerberos
  • Процедура аутентификации включает перенаправления перед вызовом 401.
  • Печенье необходимо сохранить.

ПРИМЕЧАНИЕ. Перенаправления и 401 предоставляются Oracle Access Manager - но мы знаем, что здесь нет ничего особенно экзотического, поскольку веб-ссылка работает нормально.

Любая помощь высоко ценится!

Обновление 1

Спасибо за ваш вопрос - в ответ на diggingforfile в приведенном выше примере не используется web.config. Однако, если я добавлю ссылку на сервис, будет настроен следующий конфиг:

<basicHttpBinding>
  <binding name="SomeBindingName" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxByesPerRead="4096" maxNameTableCharCount="16384"
      <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
  </binding>
<basicHttpBinding>
<client>
  <endpoint address="http://Server/Service"
    binding="basicHttpBinding" bindingConfiguration="SomeBindingName"
    contract="Namespace.ServiceName" name="SomeEndpointName" />
</client>

Если я попробую это, я получу:

"HTTP-запрос не авторизован с помощью схемы аутентификации клиента 'Anonymous'. Заголовок аутентификации, полученный от сервера, был 'Negotiate, Basic realm =" My Realm "'."

...