2012-07-15 96 views
20

,所以我有我的操作方法如何爲以下情況實現自定義授權屬性?

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

對我來說,我需要授權管理員,以便他們可以編輯的職位,但(這裏來了涼爽的一部分),我還需要允許柱的創建者能夠編輯這個帖子是一個普通的用戶。那麼我怎麼能過濾掉創建帖子的用戶以及管理員,但是讓其他人未經授權呢?我接受PostEntry id作爲路由參數,但那屬性和屬性只接受常量參數,看起來像是非常困難的東西,你的回答非常感謝,乾杯!

+1

既然你可能不知道是誰創造的職位,直到你看到它。在保溼對象之後包含這個邏輯可能會更好。否則,如果您將此作爲一個方面實施,則可能需要查看帖子兩次(一次用於授權,一次用於編輯)。 – 2012-07-15 17:20:31

+0

這個觀點很好,事實上,如果他的身份證是在角色條目上並且再次執行我的控制器邏輯,那麼我一定會查找。任何想法如何打一次數據庫? – Freeman 2012-07-15 17:56:02

+0

如果您使用的是良好的ORM並且在授權調用之前設置好上下文(不確定該部分),請考慮更多一點,然後它應該緩存在第一級緩存中。然後,你不應該看到第二次水合物的一擊。 – 2012-07-15 20:13:12

回答

42

你可以寫一個自定義的授權屬性:

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(); 
    } 
} 

,然後用它裝點您的控制器動作:

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

謝謝!這正是我需要的! – TamarG 2012-07-30 11:51:52

+0

爲什麼_ //現在id被指定=>我們不允許access_? – 2014-10-14 09:12:52

+0

**現在我看到**你需要改變:_ //現在id被指定爲** ** NO ** id被指定....(似乎如果有ID,我們不允許訪問) – 2014-10-14 09:14:48