13

私はAsp.Net Web APIから始めていますが、ここに私の問題があります:

カスタム認証フィルターを実装して、API キーを探してメッセージ ヘッダーを検査します。この API キーに基づいてユーザーを取得し、そのユーザーがリソースにアクセスできるかどうかを確認したいと考えています。確認したいリソース ID は、HTTP 要求のパラメーターにあります。しかし、AuthorizationFilter メソッドを使用している場合、アクション パラメーター リストは空です。

どうやってやるの ?

認証フィルターの代わりに ActionFilter を使用した場合、これが最初に実行されるフィルターであることをどのように確認できますか? また、グローバルに、フィルターの実行順序を指定するにはどうすればよいですか?

最後の質問ですが、任意のフィルターで取得できるデータを「パイプ上」に追加することは可能ですか? セッションストアのようなものですが、リクエストに限定されていますか?

返信ありがとうございます

4

2 に答える 2

1

パラメータを取得するもう 1 つの方法は、パラメータExecuteのバインドです。

try
{
    var binding = actionContext.ActionDescriptor.ActionBinding;
    var parameters = binding.ParameterBindings.OfType<ModelBinderParameterBinding>();
    var newBinding = new HttpActionBinding(actionContext.ActionDescriptor, parameters.ToArray());
    newBinding.ExecuteBindingAsync(actionContext, new CancellationToken());
    var id = actionContext.ActionArguments["id"] as string;
}
catch
{
    base.HandleUnauthorizedRequest(actionContext);
}

注:リクエスト URI から取得されるパラメーターのみをフィルター処理するようにする必要があります。リクエストボディから取得されると予想されるパラメーターのバインディングを実行すると、実際の URL に渡されなくなることに気付いたからです。アクション。つまり、これらのパラメーターはnullになります。

これは、これを行うことができることに注意してくださいGetRouteData()/RouteData。ASP.NET MVC モデルバインディングのさらなるフローを中断する可能性が低いため、使用することをお勧めします。

var routeData = actionContext.ControllerContext.RouteData;
var id = routeData.Values["id"] as string;
于 2013-10-17T15:49:11.573 に答える