Подтвердить что ты не робот

Обычная проверка подлинности Wcf

У некоторых проблем с использованием базовой аутентификации с помощью простой тестовой службы Wcf. Я получаю исключение:

Запрошенная служба "http://qld-tgower/test/Service.svc" не может быть активирована. Подробнее см. В журналах трассировки трассировки сервера.

И в журнале трассировки он показывает:

Схемы аутентификации, сконфигурированные на хосте ( "Basic" ), не позволяют настроить параметры привязки "BasicHttpBinding" ( "Анонимный" ). Убедитесь, что для параметра SecurityMode установлено значение Transport или TransportCredentialOnly. Кроме того, это может быть разрешено путем изменения схем аутентификации для этого приложения с помощью инструмента управления IIS через свойство ServiceHost.Authentication.AuthenticationSchemes в файле конфигурации приложения в <serviceAuthenticationManager> , обновив свойство ClientCredentialType на привязке или изменив свойство AuthenticationScheme на HttpTransportBindingElement.

Но что я не понимаю, когда я ошибаюсь в имени пользователя и пароле, он говорит, что использует базовую аутентификацию?

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

Это моя информация о web.config

<system.serviceModel>
<services>
  <service name="WcfService"
      behaviorConfiguration="Behavior">
    <endpoint address="http://QLD-TGOWER/test/Service.svc"
              binding="basicHttpBinding"
              bindingConfiguration="httpBinding"
              contract="IService" />
  </service>
</services>
<diagnostics>
  <endToEndTracing activityTracing="false" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
</diagnostics>
<bindings>
  <basicHttpBinding>
    <binding name="httpBinding">
      <security mode="TransportCredentialOnly">
        <transport  clientCredentialType="Basic" proxyCredentialType="Basic">
        </transport>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- 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="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

, и это мой App.config

<system.serviceModel>
    <diagnostics>
      <endToEndTracing activityTracing="true" />
      <messageLogging logMessagesAtTransportLevel="true" />
    </diagnostics>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" >
          <security mode="TransportCredentialOnly">

            <transport clientCredentialType="Basic" proxyCredentialType="Basic"></transport>
            <message clientCredentialType="UserName" />
          </security>

        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://QLD-TGOWER/test/Service.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
        name="BasicHttpBinding_IService" />
    </client>
</system.serviceModel>

мое тестовое приложение

private static void Main(string[] args)
{
    var proxy = new ServiceClient("BasicHttpBinding_IService");
    var clientCredentials = proxy.ClientCredentials;
    clientCredentials.UserName.UserName = "username";
    clientCredentials.UserName.Password = "password";
    var res = proxy.GetData(1);
    Console.WriteLine(res);
    Console.WriteLine("Done");
    Console.ReadKey(true);
}

И мое обслуживание

public class Service : IService
{

   public string GetData(int value)
   {
       return string.Format("You entered: {0}", value);
   }
}

Есть ли что-то, что мне здесь не хватает?

4b9b3361

Ответ 1

Измените имя и контракт службы, чтобы включить пространство имен.

Также удалите адрес конечной точки (установите его в "") и не включите proxyCredentialType в транспортный тег.

Конечный результат web.config должен выглядеть примерно так:

  <system.serviceModel>

    <services>
      <service name="MyNameSpace.MyService" behaviorConfiguration="asdf">
        <endpoint address="" binding="basicHttpBinding" 
            bindingConfiguration="httpBinding" contract="MyNameSpace.IMyService" />
      </service>
    </services>

    <diagnostics>
      <endToEndTracing activityTracing="true" messageFlowTracing="true" 
          propagateActivity="true">
      </endToEndTracing>
    </diagnostics>

    <bindings>
      <basicHttpBinding>
        <binding name="httpBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="asdf">
          <!-- 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="true" />

        </behavior>
      </serviceBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/>

  </system.serviceModel>

Ответ 2

Попробуйте как конфигурацию клиента, так и сервера

<basicHttpBinding>
    <binding name="BasicHttpBinding_IService">
        <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
        </security>
    </binding>
</basicHttpBinding>

Установить/Включить базовую аутентификацию

Вам также может потребоваться установить и применить базовую аутентификацию в IIS.

Перейдите в "Программы и функции" / "Включение/выключение функций Windows". Включите "базовую аутентификацию" где-нибудь под IIS и безопасность.

Я закрыл и открыл консоль IIS и смог включить ее в настройках аутентификации.

Это, конечно, если для тестирования разработки и предупреждает вас о том, что у вас нет SSL-сертификата.

Ответ 3

Вам не разрешено использовать аутентификацию имени пользователя по незащищенному соединению

Вы можете защитить сообщение с помощью безопасного транспорта (например, SSL) или шифрования сообщения (используя сертификаты)

Я использовал ClearUsernameBinding в прошлом с большим успехом, но я не рекомендую его в производстве. Я использовал его так, чтобы я мог сохранить весь свой код аутентификации, не требуя SSL в средах dev/test, но при этом он работает с SSL, только изменяя конфигурацию.

Примечание: эта настраиваемая привязка не идеальна, и мне пришлось немного изменить ее, чтобы внести определенные изменения в конфигурацию.

Ответ 4

Вот что я решил для меня:

<bindings>
  <basicHttpBinding>
    <binding>
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

Для справки см. https://msdn.microsoft.com/en-gb/library/ff648505.aspx