ASP.NET MVCのダイナミックアクセス制御

ASP.NET MVCには、特定のコントローラーとそのアクションへのアクセスを制限する組み込み機能があります。 この機能はAuthorizeAttribute



属性によって提供されますが、明らかに機能と柔軟性に欠けています(正確には、実際には何もありません)。 権利は開発段階でのみ決定でき、再コンパイルしないと変更できません。 しかし、必要な機能を備えた独自の属性を作成することはまったく難しくありません。



それでは始めましょう。 Visual Studioで新しいプロジェクトを作成し、タイプASP.NET MVC 3 Webアプリケーションを選択して、 DynamicAuthorizeを呼び出します 。 スタジオがプロジェクトを生成するのを待っています。

アクセス権を保存および決定する方法は、さまざまな方法で実行できます。 データベース 、リモートサービスから受信したもの、xmlファイルなど。 それはすべて、タスクと好みに依存します。 たとえば、これらのメカニズムの実装に気を取られないように、アクセス許可に関する情報を返すクラスを作成し、必要な実装に置き換えます。問題は発生しないと思います。 PermissionManager



クラス自体:

 public class PermissionManager { public bool ValidatePermissions(string controller, string action, string user) { bool isUserAccess = false; if (user == "user1" && controller == "Home") { switch (action) { case "Test": isUserAccess = true; break; } } if (user == "user2" && controller == "Home") { switch (action) { case "Edit": isUserAccess = true; break; } } //       " " if (controller == "Home" && (action == "Index" || action == "About")) { isUserAccess = true; } return isUserAccess; } }
      
      





クラスは初歩的ですので、それが何をするのかを説明する価値はないと思います。 承認自体に関しては、MVCにはIAuthorizationFilter



インターフェイスがあり、 IAuthorizationFilter



インターフェイスには単一のOnAuthorization



メソッドがOnAuthorization



ます。 このメソッドは、ユーザーを認証するために必要な場合に呼び出されます。 彼がこの操作に対する権限を持っているかどうかを確認してください。 これがまさに必要なものです。 さて、理論的には、属性自体の作成に進みます。 クラスDynamicAuthorizeAttribute





 public class DynamicAuthorizeAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { PermissionManager permissionManager = new PermissionManager(); string action = filterContext.ActionDescriptor.ActionName; string controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; string user = filterContext.HttpContext.User.Identity.Name; if (!permissionManager.ValidatePermissions(controller, action, user)) { throw new UnauthorizedAccessException("     "); } } }
      
      





AuthorizationContext



型の渡されたパラメーターには、さまざまな方法でアクセス制御を編成できる多くの便利なプロパティがありますが、この場合、検証は基本的なものであり、 PermissionManager



クラスのメソッドを使用します。

これで、実際には、動的承認の作成が完了します。 難しくないと言いました さて、テストを始めましょう。 Home



コントローラーの2つの追加アクション(2つはスタジオによって親切に作成されました)を作成しましょう。

 public ActionResult Test() { return View(); } public ActionResult Edit() { return View(); }
      
      





それらの表現を作成します(Visual Studioジェネレーターを使用しました)

そして、新しく作成した属性でコントローラーをマークします。

 [Attributes.DynamicAuthorize] public class HomeController : Controller
      
      





作成したコントローラーアクションへのリンクをIndex



ビューに追加します。

 <p> @Html.ActionLink("Test", "Test") </p> <p> @Html.ActionLink("Edit", "Edit") </p>
      
      





ここで、プロジェクトを組み立てる必要があります。Ctrl+ Shift + Bを押してください。エラーなしで動作するはずです。

テストユーザーを作成し、 ASP.NET管理ツールを起動します

画像

[ セキュリティ]セクションに移動し、 user1およびuser2という名前の2人のユーザーを追加します 。 すべてがプロジェクトを開始できます。 これで、許可なしにリンクの1つをクリックすると、アクセスエラーが表示されます。 user1としてログインすると、テストアクションは使用可能になりますが、編集は使用できません。 user2としてログインすると、逆のことが言えます。

結論として、実装の単純さにもかかわらず、新規参入者は、アクセス権の動的なチェックをどのように組織するかという質問をしばしば持っています。 この投稿が、この問題に直面している人々がそれを処理し、意図したとおりに承認を行うのに役立つことを願っています。

ここからプロジェクトをダウンロードできます。



All Articles