Надеюсь, вы мне чем-нибудь поможете. Я пытаюсь заставить мой вызов 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 "'."