0

これは .NET 4.5 C# MVC + WebAPI 4 プロジェクトです。ここで説明されているように、WebApiDoodle 2.0.1 BasicAuthenticationHandler を使用して、MVC + WebAPI をサイド バイ サイド セキュリティで使用しています。

アプリケーションの開始で、メッセージ ハンドラーを追加します。

globalConfig.MessageHandlers.Add(new {MyClass Derived from BasicAuthenticationHandler}());

MVC コントローラーは正常に動作します (から派生したクラス System.Web.Mvc.Controller)。

ただし、WebApi コントローラー (から派生System.Web.Http.ApiController) は属性を無視しSystem.Web.Http.AllowAnonymousます。彼らは基本的にすべてを認証/承認したいと考えています。

globalConfig からカスタム メッセージ ハンドラーを削除すると、WebAPI は期待どおりに動作し、AllowAnonymous 属性により、匿名の要求を処理できます ([Authorize] を持つアクションは拒否されます)。

何が起こっているのでしょうか?ありがとう。

4

2 に答える 2

0

その MessageHandler のバグのようです

https://github.com/WebAPIDoodle/WebAPIDoodle/blob/dev/src/WebApiDoodle.Web/MessageHandlers/BasicAuthenticationHandler.cs

Authorization ヘッダーが null の場合、チャレンジ (www-challenge) が返されるため、Web API は呼び出されません。認証が必要なために Web API メソッドを実行できない場合にのみ、チャレンジを返す必要があります。このようなものがあるはずです。

    return base.SendAsync(request, cancellationToken)
.ContinueWith<HttpResponseMessage>(r =>
{
  if (r.Result.StatusCode == HttpStatusCode.Unauthorized)
  {
    return HandleUnauthenticatedRequestImpl(request, cancellationToken);
  }

  return r.Result;
}); 

ハンドラーを修正できるかどうか、プロジェクトの所有者に尋ねてください。

于 2013-04-11T18:39:31.457 に答える
0

WebApiDoodle の開発者と話し合った後、彼は別のアプローチを提案しました。

ここで議論の詳細を見ることができます: https://github.com/WebAPIDoodle/WebAPIDoodle/pull/8

とにかく、開発者からの重要な部分:

AllowAnonymousAttribute にはロジックがありません。AuthorizeAttribute はそれを尊重します。私の個人的な意見では、API で認証が必要な場合は、すべてのユーザーが API に対して認証する必要があります。そのため、これをデフォルトの動作と見なしています。ただし、修正は簡単です。HandleUnauthenticatedRequest メソッドをオーバーライドして空のままにしてください。次に、チャレンジ リクエストをハンドラーの SendAsync メソッドに継続として追加します。

于 2013-04-12T22:43:21.523 に答える