2009-08-24 6 views
6

J'ai un service WCF configuré pour utiliser la validation UserName personnalisée via la méthode Validate() remplacée de la classe System.IdentityModel.Selectors.UserNamePasswordValidator.Authentification WCF UserName et contrats d'erreur

Toutes les méthodes du contrat ont été décorées avec FaultContractAttribute pour spécifier qu'une erreur SOAP personnalisée est renvoyée. Lorsque vous lancez FaultException <T>, où T est le type spécifié dans FaultContractAttribute, tout se comporte comme prévu et j'obtiens le défaut personnalisé dans le XML de réponse.

Cependant, si je tente de jeter FaultException <T> dans la méthode surchargée Valider() de la classe d'authentification nom d'utilisateur, je reçois une erreur SOAP générique avec la raison suivante:

« Le créateur de cette faute ne ne spécifie pas de raison. "

Cependant, si je change le code pour lancer la faute générale SOAP comme dans:

throw new FaultException("Authentication failed.");

j'obtenir au moins "Echec de l'authentification." dans l'élément raison.

Mes questions sont les suivantes:

  • Pourquoi ne sont pas les FaultException <T> exceptions traitées de la même si elles sont jetées dans la validation() car ils sont dans la mise en œuvre du service?
  • Est-il possible de faire en sorte que les exceptions levées dans la méthode Validate() soient conformes au FaultContractAttribute spécifié dans les méthodes de contrat?

Toute aide grandement appréciée. Ma propre supposition est que l'authentification vient avant que le message est associé à une méthode du contrat, et par conséquent, n'est pas associé à FaultContractAttribute, mais tout article le confirmant et donnant une solution de contournement serait très utile.

Tali

+0

Merci d'envoyer cette question. Des solutions? Je suis toujours à la recherche d'une réponse en mars 2013. –

Répondre

0

Il est un peu ennuyeux, mais je me suis autour d'elle en faisant ceci:

 
SecurityTokenValidationException stve 
    = new SecurityTokenValidationException("Invalid username or password"); 
throw new FaultException<SecurityTokenValidationException>(stve, stve.Message); 

Y compris le message signifie en outre que vous ne recevez pas la bête « ne précise pas une raison » un message .

0

Le problème est que le code de validation personnalisé s'exécute en dehors du contexte de OperationContract spécifique, donc il n'y a aucun FaultContract est l'endroit pour que le WCF manipule. Donc, la réponse courte est non, vous ne pouvez pas obtenir les exceptions levées à partir de votre validateur personnalisé pour honorer le FaultContract.

Vous avez quelques options ici. Celui que je préfère est de jeter le FaultException non-générique et fournir un FaultCode prédéterminé; De cette façon, mes blocs de prises peuvent différencier les fautes contractuelles des fautes de «plomberie». Notez que toute exception vous jetez d'un validateur personnalisé devrait revenir en tant que MessageSecurityException, comme indiqué ci-dessous:

// Custom Validator: 
public override void Validate(string userName, string password) 
{ 
    throw new FaultException(
    "Invalid username or password.", 
    new FaultCode("AUTHENTICATION_FAILURE")); 
} 

// Client Code: 
try 
{ 
    client.DoSomething(); 
} 
catch (MessageSecurityException ex) 
{ 
    var inner = ex.InnerException as FaultException; 
    if (inner != null && inner.Code.Name.Equals("AUTHENTICATION_FAILURE")) 
    { 
    // Security failure. 
    } 
} 
catch (FaultException<SomethingFault> ex) 
{ 
    // Exception from the method itself. 
} 
+0

J'ai essayé le mentionné ci-dessus mais j'obtiens une valeur nulle quand j'essaye de lancer ex.innerException comme FaultException. Toute aide serait appréciée. – vikasse

+0

Eh bien, quel type d'exception est l'exception interne? Si ce n'est pas une exception de faute alors votre problème n'est pas dans le service. –

+0

Je lance un type Fault Exception sur le serveur mais dans le client il dit que l'exception interne est de type system.net.webexception et que je n'ai pas le msg que j'ai lancé depuis le serveur. – vikasse

Questions connexes