1

WcfRestContrib を使用してカスタム基本認証を許可する、非常に単純な WCF4 Restful Web サービスがあります。クライアントがユーザー名とパスワードをプリエンプティブに提供する場合はうまく機能しますが、そうでない場合は、クライアントに資格情報を提供するように要求するのではなく、400 Bad Request 応答を返します (401 応答を介して)。

このサービスは、必要なクラスを属性で装飾することにより、WcfRestContrib を実装する宣言的アプローチを使用しています。これが私の ServiceContract 宣言です。

// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
                                typeof(SecurityValidator),
                                false,
                                "SearchService")
]
public class SearchService

非常に単純な操作が 1 つだけあります。

// Standard attributes here
[OperationAuthentication]
SearchResponse Fetch(SearchRequest request)

そして、私のようにUserNamePasswordValidator見えます(ただし、資格情報が渡されたときにのみ呼び出されるため、おそらく問題ではありません):

public override void Validate(string userName, string password)
{
    // TODO: Insert login validation logic here.

    // To indicate login failure, throw a FaultException
    // throw new FaultException("Unknown Username or Incorrect Password");

    // Just return to indicate that the username and password are valid
    return;
}

WcfRestContrib をデバッグしようとしたところ、WebBasicAuthenticationHandlerクラスがBasicAuthorizationException(フレームワーク コードでのみキャッチされる) をスローしていることがわかりましたが、何らかの理由で例外が 401 に変換されていません。

私がWcfRestContrib github サイトで読んだ内容に基づいて、その作者 (Mike O'Brian) が投稿した問題があり、401以外のものを返すようにしたいと言っています。 401チャレンジ。

この機能がある場合、何が欠けているのでしょうか、それとも何か間違っていますか?

アップデート

WcfRestContrib でこれを行う方法がない場合、(IIS で標準の Windows ベースの基本認証を使用する以外に) これを達成する別の方法はありますか? 私は(他の)代替ソリューションを受け入れます。

4

1 に答える 1

1

私はそれを考え出した。ServiceContract をErrorHandlerAttribute次のように装飾する必要がありました。

// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
                            typeof(SecurityValidator),
                            false,
                            "SearchService"),
 ErrorHandler(typeof(WebErrorHandler))]
public class SearchService

[ErrorHandler(typeof(WebErrorHandler))]サービスに属性を追加するだけで、すべての魔法が実現します。シンプルなものでなければならないことはわかっていましたが、机の上で額を平らにする前にそれを見たかっただけです。

于 2012-02-24T14:05:59.637 に答える