カスタム IPrincipal と IIdentity を設定するために、IAuthorizationFilter インターフェイスを実装する PrincipalFilter という名前のフィルタを作成しました。これはグローバル フィルターです。Ninject (3.0) を介して依存性注入を使用するため、フィルターを NinjectModule に次のように登録します。
this.BindFilter<PrincipalFilter>(FilterScope.Global, 0);
これはうまくいきます。少なくとも私はそう思いました。
問題となるケースがあります。重要な事実は、カスタム IIdentity のプロパティ IsAuthenticated が、ユーザー名がわかっている場合に常に true を返すとは限らないことです (ユーザーは認識できますが、認証されません)。問題は、偽造防止トークンで発生します。トークンが生成されたときと検証されたとき、現在の ID は同じではありません。ある場合には、これは mvc フレームワークの一般的な ID であり、別の場合には、これは私のカスタム ID です。2 つの ID は同じ名前を返しますが、IsAuthenticate に対して同じ値を返さない場合があります。ユーザーの名前は偽造防止トークンに含まれています。ただし、ID が認証されていない場合、トークンは ID の名前ではなく空の文字列を使用します。したがって、トークンに含まれる名前は現在の ID の名前ではないため、トークンは無効です。
そのため、ID に名前があるが認証されていない場合、ValidateAntiForgeryTokenAttribute でマークされたアクションで問題が発生します。これは、カスタム PrincipalFilter の前に ValidateAntiForgeryTokenAttribute が実行されるためです。
だから私の質問は、私のカスタム IAuthorizationFilter が ValidateAntiForgeryTokenAttribute の前に実行されるようにする方法ですか? フィルターを登録するときに FilterScope パラメーターを使用しようとしましたが、成功しませんでした。