У меня есть пользовательский валидатор, реализующий UserNamePasswordValidator. Этот валидатор вызывает другую аутентификационную веб-службу с использованием WCF для проверки пользователя.UserNamePasswordValidator отправляет пользовательское сообщение об ошибке клиенту
Он отлично работает, но я хотел бы отправить пользовательское сообщение конечному клиенту, если по какой-либо причине сбой вызова службы аутентификации (на стороне среднего сервера) сбой (FaultException, CommunicationException, TimeoutException или любое другое исключение).
Все, что я получаю на клиенте, всегда совпадает с всплывающим всплывающим сообщением об ошибке аутентификации Basic.
Как я могу отправить пользовательское сообщение клиенту (как исключение FaultException или любым другим способом)?
class CustomUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
try {
string domain="";
string userNameOnly;
//Parse userName to extract domain and userNameOnly
if(userName.Contains('\\')) {
String[] splitted = userName.Split('\\');
domain = splitted[0];
userNameOnly = splitted[1];
}
else {
userNameOnly = userName;
}
//throw new FaultException("Test fault exception from CustomUserNameValidator");
//Get the authentication service
ServiceReference1.AuthWSClient service = new ServiceReference1.AuthWSClient("AuthWSPort");
//Call the athentication service
ServiceReference1.user user = service.connect(domain, userNameOnly, password);
//TODO: Catch exceptions (invalid user throws one)
//throw new SecurityTokenValidationException("Authentication failed for \"" + userName + "\"");
}
catch (FaultException ex)
{
//throw new FaultException("Authentication service (called from ATLAS server) returned an error: \n\n" + ex.Message);
throw new SecurityTokenValidationException("Authentication service (called from ATLAS server) returned an error: \n\n" + ex.Message);
}
catch (CommunicationException ex)
{
//throw new FaultException("Communication issue with authentication service (called from ATLAS server): \n\n" + ex.Message);
throw new SecurityTokenValidationException("Communication issue with authentication service (called from ATLAS server): \n\n" + ex.Message);
}
catch (TimeoutException ex)
{
//throw new FaultException("Connection with authentication service (called from ATLAS server) has timed out: \n\n" + ex.Message);
throw new SecurityTokenValidationException("Connection with authentication service (called from ATLAS server) has timed out: \n\n" + ex.Message);
}
//catch (Exception ex)
//{
// //Unexpected exception
// log.LogError(ex.ToString());
// throw;
//}
}
}
Клиент имеет аналогичные попытки/поймать блок, но выглядит он не используется для UserNamePasswordValidator: кажется, есть специфический WCF внутренний улов на наличие ошибок с UserNamePasswordValidator.