3

私の ASP.NET Web API コントローラーでは、ユーザー ロールのユーザーへのアクセスを制限したいと考えています。これを行う一般的な方法は、AuthorizeAttribute ( exampleexample )を拡張してから、コントローラーにカスタム属性 ([AuthorizeUser] など) を振りかけることです。

これを行う別の方法は、コントローラーのコンストラクターに関数を追加することです。依存性注入を使用しているため、とにかくコンストラクターが必要です。

ここにいくつかのコードがあります:

public class MyController: ApiController
{
    private IUnitOfWork unitOfWork;
    private IAccountUtils accountUtils;

    // Constructor
    public MyController(
        IUnitOfWork unitOfWork, 
        IAccountUtils accountUtils)
    {
        this.unitOfWork = unitOfWork;
        this.accountUtils = accountUtils;

        // Restrict access to 'User' role
        accountUtils.ThrowExceptionIfUserNotInRole(User.Identity, "User");
    }

    // More code
}

フィルターを使用してユーザーを承認するチュートリアルと例は無数にあるため、それが最善の方法であると思いました。ただし、デバッガーでコードをステップ実行すると、フィルターの前にコンストラクター メソッドが起動されることがわかりました。

コードを最適化するには、ユーザーがコントローラーへのアクセスを許可されていない場合は、できるだけ早く中断することが理にかなっています。私が間違っていなければ、フィルターではなくコンストラクターで承認を実行する方が効率的です。私は正しいですか、それともここで何かが欠けていますか?

4

1 に答える 1

1

あなたの主な関心事はコードの最適化であるように思われます、そしてあなたはコントローラーコンストラクターが承認フィルターの前に実行されることに注意するのは正しいです。ただし、これら2つのソリューションのパフォーマンスの違いは非常に小さく、サービスに実際に影響を与えることはありません。

コンストラクターからのスローは機能する可能性がありますが、属性を宣言的に使用するのではなく、コードで承認する必要があるため、最も洗練されたソリューションではありません。また、オブジェクトのインスタンス化ロジックと、それほどクリーンではない承認ロジックを混在させる必要があります。

したがって、これには承認フィルターを使用することに固執することをお勧めします。

于 2013-02-19T21:22:06.473 に答える