私は以下のデータベース構造を持っています 私はASP.NET MVC 5サイトの認証/承認を構築する必要があります。次のようにASP.NET MVC5でのカスタム認証と承認?
DBスキーマが機能:すべてのuser
はgroup
に属し、各group
を付与することができます/ permission
を否定しました。それぞれの許可が(:List
、View
、Add
、Edit
、Delete
、VoteFor
、VoteAgainst
、Reject
とApprove
、および各アクションはPermissions
テーブルのエントリですPetitions
コントローラは、次のアクションを持っているでしょう、のは言わせて)、コントローラ上のアクションにマッチします。
すべての目的は、ユーザーがアクションを呼び出すたびに、そのサイトがユーザーがそのアクションに対して許可を与えられたグループに所属していることを確認し、それに応じて反応することです。
例:のは、管理者がUsers
グループにManagers
グループにPetitionsList
、PetitionsView
、PetitionsApprove
とPetitionsReject
権限を付与し、そしてPetitionsList
、PetitionsView
、PetitionsAdd
、PetitionsVoteFor
とPetitionsVoteAgainst
としましょう。この場合
- リスト請願 は
マネージャは
- が
- が請願を拒否請願を承認することができ嘆願書を表示することができます
しかし、彼らはできません
- 請願に対する請願
- 投票の投票。同様に
、ユーザーが
- は請願
に対する請願
- 承認請願
- は請願
とどちらの請願を編集または削除することができますを拒否します。
私は本当にMVC 5の属性機能を活用したいと思います。私の考えは、シーンの背後にあるすべての認証/承認を行うカスタム属性を構築することです。このようなもの:
public class PetitionsController : Controller
{
[MyCustomAuth(Permission="PetitionsList",Groups="Users,Managers")]
public ActionResult List()
{
//show the list of petitions
}
[MyCustomAuth(Permission="PetitionsView",Groups="Users,Managers")]
public ActionResult View()
{
//show a specific petition
}
[MyCustomAuth(Permission="PetitionsAdd",Groups="Users")]
public ActionResult Add()
{
//show add petition form
}
[HttpPost]
[MyCustomAuth(Permission="PetitionsAdd",Groups="Users")]
public ActionResult Add(object[] params)
{
//save new petition
}
[MyCustomAuth(Permission="PetitionsEdit",Groups="Admins")]
public ActionResult Edit(int id)
{
//show edit petition form
}
[HttpPost]
[MyCustomAuth(Permission="PetitionsEdit",Groups="Admins")]
public ActionResult Edit(object[] params)
{
//save changes to petition
}
[HttpPost]
[MyCustomAuth(Permission="PetitionsDelete",Groups="Admins")]
public ActionResult Delete(int_id)
{
//delete petition
}
[HttpPost]
[MyCustomAuth(Permission="PetitionsVoteFor",Groups="Users")]
public ActionResult VoteFor(int id)
{
//add vote supporting petition
}
[HttpPost]
[MyCustomAuth(Permission="PetitionsVoteAgainst",Groups="Users")]
public ActionResult VoteAgainst(int id)
{
//add vote against petition
}
[HttpPost]
[MyCustomAuth(Permission="PetitionsApprove",Groups="Managers")]
public ActionResult Approve(int id)
{
//approve petition
}
[HttpPost]
[MyCustomAuth(Permission="PetitionsReject",Groups="Managers")]
public ActionResult Reject(int id)
{
//reject petition
}
}
各アクションには、MyCustomAuth
という属性があります。ユーザーが実際にそのアクションを実行する権限を与えられている場合、その属性が重い吊り上げをしたいと思っています。もちろん、認証/承認されていない場合は、ログインページ/ 401 /別の場所にリダイレクトする必要があります。
私の質問はどこから始めるのですか?私はMVC 5のいくつかのクラスからいくつかの特別なインターフェイス/継承を実装することを期待していますか?あるいは、これを一から書く必要がありますか?
また、このテキストの壁を読み、正しい方向に私にヒント/ポインタを与えることに感謝します。
一般的に、データベース・アクセス・コードは(単位はコードをテストすることはできません)属性にすべきではないので、より良い解決策を持っていることであろうユーザーが正しくない許可を持っているかどうかを示す値を返すサービス。各コントローラメソッドのコードは、 'if(!_permissionService.HasPermission(DocumentType.Petitions、ActionType.Edit、user.ID){//拒否} 'のようなものかもしれません。 –
指定されたアクションを呼び出して属性クラスからサービスを呼び出す?検証を簡単にテストすることができますが、アクション上の属性のみを書き込むことができます(両方の世界の中で最高のものです)。 –
DIを使用して、あなたは2つのトップの回答を見てみることをお勧めします[ここ](http://stackoverflow.com/questions/7192543/injecting-dependencies-into-asp-net-mvc-3-action-filters-whats-wrong-これとともに) –