2011-07-20 7 views
5

ユーザーに機能へのアクセス権があるかどうかを確認する(ユーザーまたはロールを階層的な関数セットのアイテムに関連付けることができる)CustomAuthorize属性があります。与えられたアクションメソッドの場合デザイン/ビルド時にカスタム属性のパラメータを確認する

...

[CustomAuthorize("Security.Admin.ManageWidgets.Update")] 

これは動作しますが、私はセキュリティオブジェクトへの変更は、実行時まで検出されません問題を引き起こす可能性があることを心配。私はこのリスクを軽減するための単体テストを書くことができますが、コンパイル時に属性パラメータをチェックできるかどうかを知りたいと思います。私はIntellisenseにこの表現を入力させるのも好きです。

理想的には、ラムダ式を渡すことができます。

[CustomAuthorize(i => i.Admin.ManageWidgets.Update)] 

残念ながら、このis not currently possibleadditional info from Microsoft)。

また、式が評価され、文字列として属性に渡されることを期待して式をカプセル化しようとしましたが、同じエラー(式は匿名メソッドまたはラムダ式を含むことはできません)でコンパイルできませんでした。

[CustomAuthorize(LambdaToString(i => i.Admin.ManageWidgets.Update))] 

は、どのように私は私のカスタムのためのいくつかの設計時/ビルド時のサポートは、パラメータを属性を追加することができますか?

+0

+1興味深い問題です。 – Mrchief

答えて

1

T4 templatesを使用して、文字列プロパティを持つカスタムクラスを作成し、BennyMに似たコードになりますが自動的に生成することができます。

+0

これは正しい軌道に乗っているかもしれません。私のSecurityオブジェクトはすでに自動生成されており、完全修飾名を持つ各クラス/サブクラスにconstを追加できます。文字列が大丈夫であることを正確には検証していませんが、自動生成されているので、私はその仮定を安全に行うことができます(そして、私はintellisenseになります)。 – Mayo

3

定数を持つ静的クラス。

public static class Rights 
{ 
    public const string UpdateWidgets = "UpdateWidgets"; 
} 

また、装飾されたメソッドのunittestsも含まれていれば、かなり良いでしょう。

[CustomAuthorize(Rights.UpdateWidgets)] 
1

いいえコンパイル時にこれらの種類をチェックすることはできません。あなたが望むことができる最高のものは、リフレクションによってこれをチェックするビルド後の手順です。

あなたは、代わりにこのように、タイプとメソッド名を指定することもできます

[CustomAuthorize(typeof(Security.Admin.ManageWidgets), "Update")] 

しかし、あなたはまだ、これは本当にあなたを獲得どのような利点その議論の余地メソッドの名前を入力する必要があると見て。