2

NinjectのBindFilter<>構文を使用して適用しようとしている2つのフィルターがあり、それらは依存性注入で正常に適用されています。問題は、現在のユーザーが誰であるかを分類してバインドしInRequestScope、メンテナンス認証を確認するときに2番目のユーザーの前に実行する必要があるという事実にあります。そうでない場合は、参照しているユーザーがわかりません。

のフィルター結合はNinjectWebCommon.cs次のようになります。

kernel.BindFilter<CurrentUserFilter>(FilterScope.Global, 0).InRequestScope();
kernel.BindFilter<SetupRightsAttribute>(FilterScope.Controller, 1).WhenControllerType<MaintenanceController>().InRequestScope();

したがって、メンテナンスコントローラでは、最初のコントローラを実行してから2番目のコントローラを実行する必要があります。他のすべてでは、最初のものだけです-これは機能します。2番目のものは、メンテナンスコントローラーで何かを参照するときにのみ使用されます。

2つのフィルターはそのように宣言されています(無関係な詳細は除外されます)

public class CurrentUserFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    // implementation - breakpoint 1
}

public class SetupRightsAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    // implementation - breakpoint 2
}

ブレークポイント1がヒットし、次にブレークポイント2がヒットすることを期待していますが、何らかの理由で、常に最初にブレークポイント2になります。この時点ではユーザーがわからないため、認証がないことがわかります。

FilterScopeと順序設定のさまざまな順列を試しましたが、それらを異なる順序でバインドすることもできましたが、何も機能しません...何が間違っているのでしょうか。

4

1 に答える 1

3

承認フィルターはアクションフィルターの前に実行されます。これは、承認がMVC実行パイプラインでアクションの処理よりも早いためです。

于 2012-10-31T10:26:51.100 に答える