HTTP-запрос несанкционирован с помощью схемы аутентификации клиента "Basic". Заголовок аутентификации, полученный с сервера, был "Basic realm =" pc "'
Сервер:
<system.serviceModel>
<services>
<service name="Service" behaviorConfiguration="md">
<!-- Service Endpoints -->
<endpoint address="SslService" binding="basicHttpBinding" bindingConfiguration="security" contract="IService"/>
<host>
<baseAddresses>
<add baseAddress="https://pc:8080/Service.svc"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="security">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="md">
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="ClassLibrary1.CustomUserNameValidator, ClassLibrary1" />
</serviceCredentials>
<serviceMetadata httpsGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
ClassLibrary1.CustomUserNameValidato:
public class CustomUserNameValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (userName != "111" || password != "111")
{
throw new System.ServiceModel.FaultException("Unknown username or incorrect password");
}
}
}
Клиент:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService" 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"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="Basic" realm="">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://pc:8080/Service.svc/SslService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
name="BasicHttpBinding_IService" />
</client>
</system.serviceModel>
ServiceReference1.ServiceClient s = new WindowsFormsApplication1.ServiceReference1.ServiceClient();
s.ClientCredentials.UserName.UserName = "111";
s.ClientCredentials.UserName.UserName = "111";
MessageBox.Show(s.GetData(3)); // <---- ERROR
HTTP-запрос неавторизован с помощью схемы проверки подлинности клиента Basic. Заголовок аутентификации, полученный с сервера, был "Basic realm =" pc ".
Ответы
Ответ 1
Я создал такой клиент:
using (var client = new Client())
{
client.ClientCredentials.UserName.UserName = <username>;
client.ClientCredentials.UserName.Password = **<WRONG_PASSWORD>**;
...
}
Раздел безопасности моего привязки выглядел так:
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="Basic" realm="" />
</security>
И я увидел, что эта ошибка вернулась. Как только я исправил пароль, все сработало.
Ответ 2
Я предполагаю, что вы размещаете свой сервис-хост в IIS. Тогда проблема в том, что IIS перехватывает https-запрос и выполняет аутентификацию на уровне IIS до того, как среда WCF и ваш пользовательский валидатор имеет шанс зайти.
В вашем примере IIS фактически ищет локального пользователя "111" с паролем "111" на сервере, на котором запущен IIS. Попробуйте создать этого пользователя на сервере, и вы, вероятно, получите другой результат.
Одним из решений является размещение вашего хоста WCF в другом месте, например, в службе Windows. Другое решение - изменить вашу схему безопасности на TransportWithMessageCredential. Наконец, вы можете проверить этот модуль OSS http: Пользовательская базовая аутентификация для IIS - кажется, делает трюк, который нам нужен.
Ответ 3
Попробуйте отправить имя пользователя и пароль не в http с базовой аутентификацией (это может смутить IIS), но только в заголовках мыльных сообщений со следующей схемой:
<binding name="...">
<security mode="TransportWithMessageCredential" >
<message clientCredentialType="UserName" />
</security>
</binding>
Как использовать безопасность транспорта и учетные данные для сообщений
Возможно, вам также необходимо дополнительно указать <transport clientCredentialType="None">
Ответ 4
Похоже, вы задали имя пользователя дважды вместо имени пользователя и пароля.
Если у вас есть базовая аутентификация, и вы не отправляете имя пользователя и пароль с запросом, вы получаете ответ на вызов.
Ответ 5
Я отправил здесь ответ: Не удается вызвать веб-службу с базовой аутентификацией с помощью WCF
транспорт clientcredentialType
TransportCredentialOnly
Ответ 6
Я применил все вышеперечисленное, но моя проблема не решена.
В моем случае это происходит из-за прокси-сервера. Затем я удалил все прокси и запустил свой веб-сервис. Тогда все работает нормально.
Надеюсь, что это будет вам !!!!!!