0

一部のコントローラー アクションでは、ユーザーを認証する必要があります。これらのアクションには、カスタム[Authorize]属性のフラグが付けられます。舞台裏では、カスタム メンバーシップ プロバイダーがいくつかの魔法を行い、その中でいくつかの一時データを共通スレッドに設定します。

認証が必要な各アクションの最後に、OnActionExecuted()フィルターを呼び出してスレッドをクリーンアップする必要があります。これは、 と呼ばれる別のカスタム属性を介して行われます[CleanupContext]

したがって、私のアクションは次のようになります。

[Authorize]
[CleanupContext]
public ViewResult Action()
{
   ...
}

これら 2 つは常に一緒に使用されるため、私は怠け者であり、いつか 1 つの開発者がどちらか一方を配置するのを忘れる可能性があり、最終的に奇妙な動作が発生するのではないかと恐れているため、それらを 1 つの属性に結合する方法はありますか?

[AuthorizeAndCleanup]
public ViewResult Action()
{
   // Aaah, if only it could look like this :D
}

どうもありがとう!

4

3 に答える 3

3

AuthorizeAttributeカスタム認証を行うために派生させ、イベントIActionFilterにアクセスするために実装することができます (カスタム クリーンアップ コードを実行するため)。OnActionExecutingOnActionExecuted

public class AuthorizeAndCleanupAttribute : AuthorizeAttribute, IActionFilter
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // TODO: your custom authorization logic
        return base.AuthorizeCore(httpContext);
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // TODO: your custom cleanup code
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

認証が失敗した場合 (つまり、メソッドが false を返す場合)OnActionExecutingはイベントも実行されないことに注意してください。そのため、false を返す場合は、このメソッドでクリーンアップを行うようにしてください。OnActionExecutedAuthorizeCore

于 2012-07-30T11:54:52.110 に答える
0

クイック。私が考えることができる汚い(おそらく)遅い解決策は、クリーンアップ属性をスキップし、OnActionExecuted()にカスタムAuthorize属性が存在するかどうかを確認し、見つかった場合はクリーンアップコードを実行することです(それらは常に一緒に存在します)。

于 2012-07-30T11:49:59.957 に答える
0

Cleanupでマークされたアクションに属性を自動的に追加する独自のフィルター プロバイダー (http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html) を実装する必要がありますAuthorize

于 2012-07-30T11:56:11.577 に答える