2011-07-12 6 views
14

カスタムAuthorizeAttributeを作成しました。このAuthorizeAttributeは、HTTPヘッダーの内部で送信されるいくつかのOAuth資格情報を検証します。これらの資格情報の一部を使用して、誰が要求を行っているかを特定しています。一度私はAuthorizeAttributeでこの情報を解析する方法は、データをコントローラのインスタンス変数に割り当てることができるようにそれを渡す方法はありますか?私のコントローラーのどこにいても、私は要求側のIDを持っています。AuthorizeAttributeからコントローラにデータを渡すにはどうすればよいですか?

答えて

12

オリジナル答え

あなたはおそらくしたいと思い、あなたのフィルターで

filterContext.HttpContext.Items["test"] = "foo"; 

そして、あなたのアクションで、この

_yourVariable = HttpContext.Items["test"]; 

これを行うことができるはず"test"よりも一意のキーを使用してください。

EDITあり、我々は行動ではなく、コンストラクタでこれを行う二つの理由です:

  1. A Controller's constructor fires before OnAuthorizationは、その項目がまだ設定されません。
  2. HttpContextがコントローラのコンストラクタにまだ設定されていません。

代替ソリューション

  1. OAuthControllerに新しいOAuthController : Controller
  2. オーバーライドOnAuthorization
  3. 設定しOAuthController.OnAuthorization
  4. protectedフィールドをあなたのフィルタからのロジックを移動する(すなわち、protected object myAuthData)を作成します
  5. 他のコントローラはControllerの代わりにOAuthControllerを継承してください。
  6. 他のコントローラはmyAuthDataにアクセスできます。
+0

Hmm ...この変数を設定するためにコントローラにコンストラクタを追加すると、モデルバインディングがすべて破損しました(エラーがスローされます)。他のアイデア? – BigOmega

+0

@ Ryan私はもともとこれを私の答えに書いていましたが、削除しました。とにかく、コントローラのコンストラクタが** OnAuthorizationの前に**起動するので、アイテムはまだ設定されません。さらに、コントローラはまだその時点でHttpContextを持っていません。あなたの行動でこれを行う必要があります。 –

+0

@ Ryan 'OAuthController:Controller'を作成し、リンク先の記事で述べた' OnAuthorization'をオーバーライドし、 'protected'メンバを設定し、他のコントローラに継承させることもできます。 –

関連する問題