9

ASP.NET MVC でデフォルトの [Authorize] 動作をオーバーライドできるかどうか、またはどのようにオーバーライドできるか疑問に思いました。新しいアクション フィルターを作成したり、独自の属性を作成したりできることはわかっています。[Authorize] の動作を単純に変更して、その動作を自分のコードに置き換えることができるかどうかに興味がありますか?

編集:男と女。あなたの意見に感謝しますが、私が書いたように、新しい [XYZAuthorize] 属性を導入するつもりはありません。私はこれを行う方法を知っています。[Authorize] 表記はそのままで、動作を変更したいだけです。

4

5 に答える 5

9

AuthorizeAttribute フィルターをサブクラス化し、独自のロジックをその中に入れることができます。

例を見てみましょう。常にローカル接続を承認したいとしましょう。ただし、リモート接続の場合は、通常の承認ロジックを維持したいと考えています。

次のようなことができます。

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

または、特定のリモート アドレス (たとえば、マシンなど) を常に承認することもできます。

それでおしまい!

編集: 言及するのを忘れました。AuthorizeAttribute フィルターを使用するのと同じように使用します。

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}
于 2009-08-22T09:02:05.287 に答える
6

はい、AuthorizeAttribute の MSDN ドキュメントをご覧ください: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

基本的に、OnAuthorization() メソッドをオーバーライドして動作をカスタマイズできます。属性には他の仮想メソッドもあります。

編集: ブルーノが指摘したように、 AuthorizeCore() メソッドをオーバーライドできます。主な違いは、AuthorizeCore() が HttpContextBase を受け取るのに対し、OnAuthorization() は AuthorizationContext を受け取ることです。AuthorizationContext のインスタンスは、Controller、RequestContext、RouteData などの詳細情報を提供します。また、ActionResult を指定することもできます。

AuthorizeCore() は、アクセスできる情報と返すことができる結果がより制限されていますが、キャッシュされたデータを承認する必要がある場合は、余分なデータがない場合をロジックで処理する必要があります (要求が MVC パイプラインを介してルーティングされる前にデータがキャッシュから提供されるため)。

いつものように、シナリオと使用可能なツール、およびそれらの間のトレードオフを理解する必要があります。

于 2009-08-22T09:04:20.710 に答える
4

独自のロール プロバイダーを実装し、それを使用するようにアプリを設定します。次に、Authorize 属性はあなたの認証コードを尊重します。

于 2009-08-22T15:55:39.283 に答える
2

メソッドをオーバーライドAuthorizeAttribute.OnAuthorizationするか、独自のauthorize属性を最初から作成するという2つの方法しかありません。

1) 非常に簡単:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) 簡単すぎます - ASP.NET MVC ソース、AuthorizeAttribute.csファイルを見てください。

于 2009-08-22T09:03:58.637 に答える
1

通常どおりカスタム フィルターを実装し (必要に応じて AuthorizeAttribute を継承)、ControllerActionInvokerを継承してGetFilters をオーバーライドする新しい ActionInvoker を作成できるようです。GetFilters では、呼び出しbase.GetFilters()てフィルターのリストを取得し、AuthorizationFilters を反復処理して、AuthorizeFilter の呼び出しをカスタム フィルターの呼び出しに置き換えます。

もう 1 つの考えられる方法は、何をしようとしているかに応じて、カスタム メンバーシップとロール プロバイダーを実装することです。

于 2009-08-22T09:09:10.217 に答える