Сервис зависает при подключении
Аутентификация в WCF-приложении происходит по механизму UserName. Система зависает при вызове методов сервиса. Затем выдаётся ошибка о том, за промежуток времени не удалось завершить согласование безопасности. При этом подключение к сервису есть. Привязка - wsDualHttpBinding. Проект размещен в облачной службе Azure. Web.config:
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="ProjectManagement_Server.CustomUserNameValidator, ProjectManagement_Server"/>
<serviceCertificate
findValue="4EDC883490C36916B78C59E0A5013E7F3DA0918E"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint"/>
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="ProjectManagement_Server.CustomX509CertificateValidator, ProjectManagement_Server"/>
</clientCertificate>
</serviceCredentials>
...
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
CustomUserNameValidator.cs:
public class CustomUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (!(userName == "user" && password == "pass"))
{
throw new FaultException("Неверный логин или пароль");
}
}
}
CustomX509CertificateValidator.cs:
public class CustomX509CertificateValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
if (certificate == null)
throw new ArgumentNullException("certificate");
if (certificate.Subject != certificate.Issuer)
throw new SecurityTokenException("Certificate is not self-issued");
}
}
Ответы (1 шт):
На сколько я понял, проблема в том, что wsDualHttpBinding создаёт двустороннюю связь: клиент-сервер и наоборот. Главная проблема именно в обратной связи. Роутер, файервол не позволят сделать это просто так. Необходимо открывать порты. Это можно сделать далеко не во всех случаях. Поэтому в данном случае нужно переходить на netTcpBinding...