Ошибка WCF: вызывающая сторона не была аутентифицирована службой
Я пытаюсь получить доступ к моей службе WCF на сервере из моего клиентского консольного приложения для тестирования. Я получаю следующую ошибку:
Звонящий не был аутентифицирован службой
я использую wsHttpBinding
, Я не уверен, какую аутентификацию ожидает служба?
<behaviors>
<serviceBehaviors>
<behavior name="MyTrakerService.MyTrakerServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
Обновление Это работает, если я изменю свою привязку на <endpoint "basicHttpBinding" ... />
(из wsHttpBinding) на сервере IIS 7.0, на сервере Windows 2008
11 ответов
Если вы используете basicHttpBinding, настройте безопасность конечной точки на "Нет" и перенесите clientCredintialType на "Нет".
<bindings>
<basicHttpBinding>
<binding name="MyBasicHttpBinding">
<security mode="None">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint
binding="basicHttpBinding"
bindingConfiguration="MyBasicHttpBinding"
name="basicEndPoint"
contract="IMyService"
/>
</service>
Также убедитесь, что в разделе "Методы проверки подлинности в IIS" включен анонимный доступ.
Я понял.
Если вы хотите использовать wshttpbinding, вам нужно добавить учетные данные Windows, как показано ниже.
svc.ClientCredentials.Windows.ClientCredential.UserName = "abc";
svc.ClientCredentials.Windows.ClientCredential.Password = "xxx";
Спасибо
Вы пытались использовать basicHttpBinding вместо wsHttpBinding? Если не требуется какая-либо аутентификация и реализации Ws-* не требуются, вам, вероятно, будет лучше использовать старый добрый basicHttpBinding. WsHttpBinding реализует WS-Security для защиты сообщений и аутентификации.
Установить анонимный доступ в вашем виртуальном каталоге
написать следующие учетные данные к вашим услугам
ADTService.ServiceClient adtService = new ADTService.ServiceClient();
adtService.ClientCredentials.Windows.ClientCredential.UserName="windowsuseraccountname";
adtService.ClientCredentials.Windows.ClientCredential.Password="windowsuseraccountpassword";
adtService.ClientCredentials.Windows.ClientCredential.Domain="windowspcname";
после этого вы вызываете методы веб-сервиса.
Мы столкнулись со странной проблемой, когда папка, из которой размещался сервис WCF, имела некоторые разрешения, которые вызывали проблему.
Мне удалось решить общую проблему, выполнив следующие действия:
- Перейти на IIS->Сайты->Ваш сайт->
- Особенности Панель просмотра ->Аутентификация
- Установить анонимную аутентификацию на Отключено
- Установите проверку подлинности Windows на Включено
Если вы используете собственный сайт, такой как я, способ избежать этой проблемы (как описано выше) состоит в том, чтобы на стороне хоста и на стороне клиента указать, что режим безопасности wsHttpBinding = NONE.
При создании привязки, как на клиенте, так и на хосте, вы можете использовать этот код:
Dim binding as System.ServiceModel.WSHttpBinding
binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None)
или же
System.ServiceModel.WSHttpBinding binding
binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);
Если необходимо указать домен (который идентифицирует имя пользователя и пароль, которые использует клиент) в webconfig, вы можете указать это в разделе службы service.serviceModel:
<identity>
<servicePrincipalName value="example.com" />
</identity>
а в клиенте укажите домен и логин и пароль:
client.ClientCredentials.Windows.ClientCredential.Domain = "example.com";
client.ClientCredentials.Windows.ClientCredential.UserName = "UserName ";
client.ClientCredentials.Windows.ClientCredential.Password = "Password";
Это может быть вызвано тем, что клиент находится в другом домене, чем сервер.
Я сталкивался с этим при тестировании одного из моих приложений с моего ПК (клиента) на мой (облачный) сервер тестирования, и самое простое решение, о котором я мог подумать, - это настройка vpn.
У меня тоже была такая же проблема в wsHtppBinding
, И я просто должен был добавить security
режим, указывающий на none
, это решило мою проблему и нет необходимости переключаться на basicHttpBinding
, Проверьте здесь и проверьте, как отключить безопасность WCF. Проверьте изменение конфигурации ниже для справки:
<wsHttpBinding>
<binding name="soapBinding">
<security mode="None">
<transport clientCredentialType="None" />
<message establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
Почему вы не можете просто полностью удалить настройку безопасности для wsHttpBinding ("none" вместо "message" или "transport")?