ソースコード(http://aspnetwebstack.codeplex.com/で利用可能)を見ると、これは標準のフィルタークラスでは不可能であることがわかります。 IAuthorizationFilter
の実装は、IActionFilter
の実装より前に常に実行されます。認可フィルタが結果を返すとき、アクションフィルタは実行されないからです。カスタムControllerFactory
クラスであなたのコントローラにカスタムMyControllerActionInvoker
クラスを注入する必要が
public class MyControllerActionInvoker : ControllerActionInvoker
{
public override bool InvokeAction(ControllerContext controllerContext, string actionName)
{
// Your initialization code here
try
{
return base.InvokeAction(controllerContext, actionName);
}
finally
{
// Your finalization code here
}
}
}
:
public class MyControllerFactory : DefaultControllerFactory
{
private readonly MyControllerActionInvoker actionInvoker = new MyControllerActionInvoker();
/// <summary>
/// Retrieves the controller instance for the specified request context and controller type.
/// </summary>
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
var controllerInstance = base.GetControllerInstance(requestContext, controllerType);
if (controllerInstance != null)
{
var typedController = controllerInstance as Controller;
if (typedController != null)
{
typedController.ActionInvoker = this.actionInvoker;
}
}
return controllerInstance;
}
}
をあなた自身
ControllerActionInvoker
子孫クラスを作成し、
InvokeAction
メソッドをオーバーライドすることができ、これを解決するために
もちろん、自分でMyControllerFactory
をMVCフレームワークに登録する必要があります。
var controllerFactory = new MyControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
この実装はここで問題なく動作します。
Authorize Filterは、ユーザーに許可があるかどうかをチェックし、許可されていない場合は何もチェックしません。奇妙なことをしているように聞こえる。たぶんあなたがそれらを交換したい理由を説明してください。 –
さて、アクションフィルタは、特定のユーザが一時的なパスワードを持っているかどうかをチェックするので、「パスワードの変更」ページにリダイレクトされ、「許可されていません。うまくいくと思います... – davey1990
一時的なパスワードを持つ人がAuthorizeチェックに失敗するように思えますが、一時パスワードを持っている場合は「Unauthorized」ページをチェックして、その場合は「パスワードの変更」ページを開きます。また、ログイン時にこれをキャッチして、ログインを許可する前にパスワードを変更するように強制することもできます。それで、心配する必要はありません。 –