2012-07-15 34 views
20

ので、私は私のアクションメソッド私は、彼らが記事を編集できるように、管理者を認証する必要がありますが、(ここではクールな部分が来る)、私もポストの作成者ができることができるようにする必要があり、私の場合は次のケースでカスタムAuthorize属性を実装する方法は?

[Authorize(Roles="Admin")] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 

を持っています通常のユーザーである投稿を編集します。どうすれば投稿を作成したユーザーと管理者を除外できますが、他のユーザーは権限のないままにしておくことができますか? PostEntry IDを経路パラメータとして受け取っていますが、属性の後にも属性は定数パラメータしか受け付けません。非常に困難なもののように見える、あなたの答えは非常に高く評価されます。

+1

:その後、

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { var authorized = base.AuthorizeCore(httpContext); if (!authorized) { // The user is not authenticated return false; } var user = httpContext.User; if (user.IsInRole("Admin")) { // Administrator => let him in return true; } var rd = httpContext.Request.RequestContext.RouteData; var id = rd.Values["id"] as string; if (string.IsNullOrEmpty(id)) { // No id was specified => we do not allow access return false; } return IsOwnerOfPost(user.Identity.Name, id); } private bool IsOwnerOfPost(string username, string postId) { // TODO: you know what to do here throw new NotImplementedException(); } } 

し、それを使用してコントローラのアクションを飾るに。オブジェクトを水和した後にこのロジックを含める方が良いかもしれません。それ以外の場合は、これをアスペクトとして実装すると、投稿を2回ルックアップする必要があります(承認のために1回、編集のために1回)。 –

+0

ポイントを置くと、実際には、彼のIDがロールのエントリにあり、コントローラのロジックをやり直していれば、私は一度調べます。任意のアイデアをどのように一度だけデータベースをヒットするには? – Freeman

+0

これについてもう少し考えてみましょう。あなたが良いORMを使用していて、認証呼び出しの前にコンテキストを設定している場合(その部分についてはわからない場合)、第1レベルのキャッシュにキャッシュする必要があります。その後、2番目の水和物のヒットのビットとして表示する必要はありません。 –

答えて

42

あなたは属性認可カスタムを書くことができます:あなたはそれを見てまで、ポストを作成した人知らないかもしれないので

[AuthorizeAdminOrOwnerOfPost] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 
+0

ありがとうございます!それはまさに私が必要なものです! – TamarG

+0

なぜ_ _ // IDが指定されました=>私たちはaccess_を許可していませんか? –

+0

**私はあなたが変更する必要があることを見ている_ _// IDは指定されました** NO ** IDが指定されました....(IDがあればアクセスできません) –

関連する問題