2009-08-06 8 views
0

メンバシップを使用したくないとし、ActionFilterでユーザーのアクセスを制限したいとしましょう。ASP.NET MVC ActionFilterでユーザーの詳細を確認

私はフィルタ/属性を作成してOnActionExecutingメソッドをオーバーライドでき、さらにこの属性をActionResultに入れることができます。

'tbUsers'という名前のテーブルがあり、 'certificate'というintフィールドもあり、この 'certificate'値に応じて、ユーザーはActionResultにアクセスするかどうかを判断します。

しかし、OnActionExecutingメソッドで、このユーザーの「証明書」の値を確認し、アクセスを許可するか、「NotAllowed.aspx」ページにリダイレクトするにはどうすればよいですか?

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

答えて

1

ActionExecutingContextには、現在のUserオブジェクトを含むHttpContextがあります。これを使用してユーザーを取得できます。また、セッションに情報を保存する場合は、セッションにアクセスするために使用することもできます。また、暗号化されたクッキーに入れて、コンテキスト上のRequest.Cookiesを通してアクセスすることもできます。私はそれを認証cookieよりも問題には見えませんが、セキュリティの意味を考えてみてください。

データベースに対してチェックを行い、フィルタのテスト容易性を維持するのはやや難解です。私がやったことは、各フィルタークラスに2つのコンストラクターを用意することです。私はデータ・コンテキストを作成するデータベース・ファクトリを提供しています。私はこれをテストに使用して、擬似または偽のデータベースを生成するモックデータベースファクトリを提供します。通常のパラメータのないコンストラクタは、ヌルファクトリを持つ前のコンストラクタを呼び出します。これが起こると、別のコンストラクタがデフォルトファクトリの新しいインスタンスを作成します。

private IDatabaseFactory Factory { get; set; } 
public MyFilter(IDatabaseFactory factory) 
{ 
    this.Factory = factory ?? new DefaultDatabaseFactory(); 
} 

public MyFilter() : this(null) { } 
4

私はこのようにはしません。私はIAuthorizationFilterを実装します。認可フィルタはすべてのアクションフィルタの前に実行されます。

たとえば、後でアクションメソッドにOutputCache属性を設定し、それが認証フィルタの前に実行されるとします。それは悪いだろう!コンテンツがキャッシュされている場合、認証フィルタは決して実行されず、人々はキャッシュされた機密データを見るでしょう。

関連する問題