2015-02-16 4 views
1

У меня есть пользовательский валидатор, реализующий 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.

ответ

1

Когда бросал исключение из Validate метода UserNamePasswordValidator, исключение обернуто как InnerException о наличии MessageSecurityException (от System.ServiceModel.Security пакета), который является типом вы должны поймать сторону клиента:

try 
{ ... } 
catch (MessageSecurityException e) 
{ 
    Exception exc = e.InnerException; 
    // Process "exc" here, depending of its type 
} 

Надеюсь, это поможет.

Смежные вопросы