2011-12-09 12 views
4

mvc3アプリケーションでユーザー権限管理を実装する作業を進めています。カスタム属性のmvc3アクションメソッドパラメータの検索

私はコントローラ名、ACTIONNAMEでデータベースに私のアクションメソッドを定義している、とパラメータなどのParameterNameとのParameterType

は、私が承認属性から継承されたカスタム属性を実装し構成されています。

私がしようとしているのは、データベースに定義されている私の組み込みアクションの中で実行されているアクションを見つけ、ユーザーが指定されたアクションに対して許可を持っているかどうかを計算することです。

コードは次のとおりです。

[HttpPost] 
[MyAuthorize] 
public ActionResult Edit(VendorPageItem entity) 
{ 
    //... 
} 

public class MyAuthorize: System.Web.Mvc.AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     string controller = httpContext.Request.RequestContext.RouteData.Values["controller"].ToString(); 
     string action = httpContext.Request.RequestContext.RouteData.Values["action"].ToString(); 
     int userId = SessionState.Current.LoginParameter.VendorUserID; 

     List<string> parameterTypes = new List<string>(); 
     //TODO: Find out action method parameter types. 

     return IoCWorker.Resolve<IUserRightService>().HasUserRightToAction(userId, controller, action, parameterTypes); 
    } 
} 

私の問題は、私のカスタム属性でメソッドのパラメータ型を見つけることです。

ありがとうございました。

編集:それは後のアクションです。 [HttpPost]が追加されました。

+0

私はこのように 'AuthorizeAttribute'を使いましたが、コントローラメソッドのパーミッションをチェックするほうが簡単だと分かりました。 –

答えて

2

ここでは反射が答えだと思います。

コントローラーとアクションがあり、あらかじめネームスペースを知っていることが前提であれば、コントローラTypeを調べて、そのメソッドと相対的な署名/オーバーロードをドリルダウンすることができます。

また、コントローラとアクションとは別にRouteDataの内容全体を調べると、メソッドに渡される内容がわかります。

私はそれを試していませんが、あなたが言うことから、このように動作するようです。

+1

私は、 "定義"、 "管理"、 "コモンズ"のようなフォルダをControllersフォルダの下に持っています。したがって、名前空間は異なります。 私はAuthorizeCoreメソッドのhttpContextを操作パラメーター情報を検索することについては試しましたが、運はありません。 – berdem

1

私はあなたの質問を正しく理解したかどうかはわかりません。パラメータの値にアクセスしようとすると、私はあなたに答えがあります。実際にパラメータの型を知りたいのであれば、@Matteo Moscaの答えは正しいでしょう:

パラメータはどこから来るのかによって異なります。 QueryStringパラメータ、フォームパラメータ、クッキーのいずれであっても、または...

ASP.NETのモデルバインダーインフラストラクチャは、アクションメソッドのパラメータをマップしようとします。カスタム属性では、コンテキストに応じてパラメータにアクセスできます(例:

string input = httpContext.Request.Form["myInput"] 

EDIT: あなたが投稿パラメータに関する情報を必要とするので、これは当然のことながら素敵なソリューションではありません。私はあなたの本当の必要条件を知らないので、私はより良い提案をすることはできません。もちろん、Formコレクションを繰り返し処理することもできます。

可能性は、フィールドの名前をMyAuthorizeAttributeのパラメータ/プロパティとして渡すことができます。

+1

私のアクションメソッドはpost acitonで、jquery postを使用しています。だから、私はクエリ文字列を持っていない:(。 – berdem

+0

でも、同じ方法でFormsコレクションにアクセスできます。私はAJAXリクエストで動作するかどうかはまだ分かりません。 – slfan

+1

私はフォームのコレクションを得ることができますが、私はそれがコントロールのキーと値をフォームで見ている。たとえば、キーModelName.Entity.Nameおよびその値として。 しかし、私はそのフォームコレクションに "VendorPageItem"タイプがありません。 – berdem