6

System.IdentityModel.Selectors.UserNamePasswordValidator クラスのオーバーライドされた Validate() メソッドを介してカスタム UserName 検証を使用するように構成された WCF サービスがあります。

コントラクトのすべてのメソッドは、FaultContractAttribute で装飾されており、カスタム SOAP エラーが返されるように指定されています。

FaultException<T> (T は FaultContractAttribute で指定された型) をスローすると、すべてが期待どおりに動作し、応答 XML でカスタム エラーを取得します。

ただし、ユーザー名認証クラスのオーバーライドされた Validate() メソッドで FaultException<T> をスローしようとすると、次の理由で一般的な SOAP エラーが発生します。

「この障害の作成者は理由を特定しませんでした。」

ただし、次のように一般的な SOAP エラーをスローするようにコードを変更すると、次のようになります。

throw new FaultException("Authentication failed.");

少なくとも「認証に失敗しました」と表示されます。reason 要素で。

私の質問は次のとおりです。

  • Validate() でスローされた場合、FaultException<T> 例外がサービス実装内にあるため、同じように扱われないのはなぜですか?
  • Validate() メソッドでスローされた例外を、コントラクト メソッドで指定された FaultContractAttribute に準拠させることは可能ですか?

どんな助けでも大歓迎です。私自身の推測では、メッセージがコントラクトのメソッドに関連付けられる前に認証が行われるため、FaultContractAttribute には関連付けられませんが、これを確認して回避策を提供する記事は非常に役立ちます。

タリ

4

2 に答える 2

0

問題は、カスタム検証コードが特定のコンテキストの外部で実行されているため、WCFが処理する場所OperationContractがないことです。FaultContractしたがって、簡単な答えは「いいえ」です。カスタムバリデーターからスローされた例外を取得してを尊重することはできませんFaultContract

ここにはいくつかのオプションがあります。私が好むのは、非ジェネリックをスローしFaultException、事前に決定されたものを提供することFaultCodeです。このようにして、私のキャッチブロックは契約障害と「配管」障害を区別できます。MessageSecurityException以下に示すように、カスタムバリデーターからスローした例外はすべて、として返されることに注意してください。

// 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.
}
于 2012-04-20T13:57:57.700 に答える
0

少し面倒ですが、次のようにして回避しました。

SecurityTokenValidationException stve
  = new SecurityTokenValidationException("無効なユーザー名またはパスワード");
throw new FaultException<SecurityTokenValidationException>(stve, stve.Message);

さらにメッセージを含めると、ばかげた「理由が指定されていません」というメッセージが表示されなくなります。

于 2010-08-25T14:57:27.783 に答える