Обычная проверка подлинности 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);
}
}
Есть ли что-то, что мне здесь не хватает?
Ответы
Ответ 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