5

web.configを介してUserNamePasswordValidatorに接続されたWCFサービスがありますが、問題ありません。私のバリデーターでは、Validate をオーバーライドし、資格情報を確認して、必要に応じて FaultException をスローします。

例:

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 をすばやく検索すると、サーバー/クライアントの時刻同期を含むさまざまな問題が発生します..)。また、サード パーティがサービスを利用することになるため、できるだけ明確にする。

4

3 に答える 3

3

私は数か月前にまったく同じ問題を抱えていましたが、いくつかの調査の結果、バリデーターコードから必要なものを何でもスローできるという結論に達しましたが、クライアントは引き続き MessageSecurityException を取得しますが、これには有用な情報がまったく含まれていません。

ただし、実際に何が起こったのかをクライアントに知らせる必要がありました。

そのため、CredentialValidator ロジックを、ケース 1 でのみ例外をスローするように変更しました。それ以外の場合は、実際の WCF メソッドの呼び出しを実際に許可しますが、パスワードの有効期限などもチェックし、問題が発生した場合はスローします。メソッド本体からすでに FaultException が発生しています。

私たちの場合、これは、このタイプの検証を伴うサービスがログイン サービスである場合にのみうまく機能しました。そのため、クライアントは、自分が認証されなかった正確な理由を常に知ることができます。

于 2011-12-21T21:50:57.260 に答える
1

カスタム パスワード バリデーターから、何が問題なのかを説明する FaultCode を返すことができます。

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"));
于 2012-07-26T16:51:01.137 に答える
0

エラーを MessageSecurityException としてスローし、内部例外を 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"));
    }
}
于 2013-01-25T08:23:44.070 に答える