Ошибка 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, имела некоторые разрешения, которые вызывали проблему.

Мне удалось решить общую проблему, выполнив следующие действия:

  1. Перейти на IIS->Сайты->Ваш сайт->
  2. Особенности Панель просмотра ->Аутентификация
  3. Установить анонимную аутентификацию на Отключено
  4. Установите проверку подлинности 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")?

Другие вопросы по тегам