2011-12-21 9 views
3

Web.configを使用してUserNamePasswordValidatorに接続したWCFサービスがありますが、問題はありません。私のバリデーターでは、Validateをオーバーライドし、資格情報をチェックし、必要に応じてFaultExceptionをスローします。UserNamePasswordValidatorはMessageSecurityException以外の何かをスローできますか?

例:

public class CredentialValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     if (userName != "dummy") 
     { 
      throw new FaultException<AuthenticationFault>(new AuthenticationFault(), "Invalid credentials supplied"); 
     } 
    } 
} 

私は.NETアプリケーションでこのサービスを自分で消費し、無効な資格情報を提供する場合は、MessageSecurityException次のメッセージがスローされます。

「無担保か、正しく安全なフォールトましたフォールトコードと詳細については、内部FaultExceptionを参照してください。

私が予想していたFaultExceptionは、MessageSecurityExceptionのInnerExceptionです。

クライアントにFaultExceptionを受信させる方法はありますか?

MessageSecurityExceptionは、例外の真の原因について特に説明していません(SOのクイック検索では、サーバー/クライアントの時刻同期などのさまざまな問題が発生します)。また、サードパーティがサービスを消費するため私は可能な限り明確にしたいと思います。

答えて

3

私は数ヶ月前に同じ問題を抱えていましたが、いくつかの研究の後に、あなたはバリデーターコードから必要なものを投げることができましたが、クライアントはMessageSecurityExceptionを取得します。

私たちは、しかし、実際に何が起こったかを知るために、クライアントを与えなければならなかった - 1.間違ったユーザー名/パスワードを 2.パスワードの有効期限が切れ、変更は 3.他のいくつかのカスタムアプリケーション固有の状態に

を必要だから我々はCredentialValidatorロジックを変更それはそれは実際に本物のWCFメソッドを呼び出すことができるようになるが、私たちはそこにパスワードの有効期限などのためにもチェックして、いくつかの問題が発生した場合に、メソッド本体からすでにFaultExceptionをスローしていました他の例では唯一のケース1に例外をスローする方法で。これは、このタイプの検証のみのサービスのためによく働いていた私たちの場合は

は、ログイン中のサービスだった - ので、まさに彼が認証されなかった理由を、クライアントは常に知っているだろう。間違っているのかを説明しますが、のFaultCodeを返すことができるカスタムパスワードバリデータから

+0

として、内部例外でMessageSecurityExceptionなどのエラーを投げ、私はをクライアントに提供する必要はありません失敗した認証の詳細についての情報があるので、私はバリデータからfaultexceptionを投げつけていると思います。 – diggingforfire

1

throw new FaultException("Invalid user name or bad password.", new FaultCode("BadUserNameOrPassword")); 

throw new FaultException("Password expired.", new FaultCode("PasswordExpired")); 

throw new FaultException("Internal service error.", new FaultCode("InternalError")); 
+1

-1:動作しません。 –

+0

上記の手法では、メッセージとFaultCodeが設定されたFaultExceptionであるInnerExceptionを持つMessageSecurityExceptionがキャッチされます。 –

0

FaultException

public override void Validate(string userName, string password) 
{ 
    var isValid = ValidateUser(userName, password); 
    if (!isValid) 
    { 
     throw new MessageSecurityException("Userid or Password is invalid", new FaultException("Userid or Password is invalid")); 
    } 
} 
+0

これは私のために働いた! – cableload

+0

これは、Fault例外を投げるだけで元に戻ってしまうものです。 OPは、カスタムの障害(例えば障害)バック渡したいです。 –

+0

- DRAirey1 - 新しいMessageSecurityException( "ユーザーIDまたはパスワードが無効です"、新しいFault ( "ユーザーIDまたはパスワードが無効です"))が発生します。 – Stix

関連する問題