2015-07-12 88 views
1

我有一個俱樂部表,當一個新的創建一個新的角色創建俱樂部(俱樂部的id)管理員。基於動態角色的方法授權

我希望能夠在該方法的授權屬性中引用此角色。

繼承人什麼伊夫試圖在控制器方法:

 [Authorize(Roles = "Club" + clubId + "Admin")] 
    public ActionResult ClubDetails(int clubId) 
    { 
     var viewModel = db.Clubs 
      .Where(t => t.ClubId == clubId) 
      .Select(t => new ClubDetailsViewModel 
      { 
       ClubId = t.ClubId, 
       Name = t.Name, 
       ShortName = t.ShortName, 
       Founded = t.Founded, 
       ContactName = t.FirstName + " " + t.LastName, 
       Address1 = t.Address1, 
       Address2 = t.Address2, 
       City = t.City, 
       County = t.County, 
       Postcode = t.Postcode, 
       Telephone = t.Telephone, 
       Email = t.Email, 
       Website = t.Website, 
       Bio = t.Bio, 
       ClubTypeId = t.ClubTypeId, 
       MembershipStatusId = t.MembershipStatusId, 
       ChequesPayable = t.ChequesPayable, 
       BACSAcc = t.BACSAcc, 
       BACSSort = t.BACSSort, 
       PaypalAdd = t.PaypalAddress, 
      }) 
      .FirstOrDefault(); 
     return View(viewModel); 
    } 

但是,這給出了clubId錯誤的授權屬性。在當前上下文中不存在名稱clubId

有沒有一種方法可以引用傳遞給authorize屬性中方法的參數?

+0

好吧,授權屬性在綁定發生之前在MVC管道中執行。你我應該創建你自己的授權過濾器。 [這個答案](http://stackoverflow.com/a/12828402/1849444)將幫助你我。 –

回答

2

不需要。您必須覆蓋AuthorizeAttribute類使您自己的自定義屬性。

[AttributeUsageAttribute(AttributeTargets.Class | 
          AttributeTargets.Method, 
          Inherited = true, AllowMultiple = true)] 
public class CustomAuthorizeAttribute : AuthorizeAttribute { 

    public override bool AuthorizeCore(HttpContextBase context) { 

     // this is where you can inspect the principal in context.User 
     // and check if he/she is in role 

     // you can get the clubId from context.Request.Params 

     var clubId = int.Parse(context.Request.Params["clubId"]); 

     return context.User.IsInRole(string.Format("Club{0}Admin", clubId)); 
    } 

} 

然後

[CustomAuthorizeAttribute] 
public ActionResult ClubDetails(int clubId) 

你甚至可以移動Club{0}Admin該屬性的構造函數作爲參數。

+0

非常感謝,有沒有一種方法可以將其他角色添加到屬性中,以便可以授權多個角色? –

+0

另外我需要放置自定義屬性定義? –

+0

將代碼放在需要的位置,以便可以從控制器訪問該類。這應該是基本的。另外,可以根據需要修改核心代碼,並根據需要傳遞其他參數。我的例子只是爲了讓你開始。 –

0

您無法將動態數據傳遞給屬性。 解決你的問題,你可以繼承授權屬性和檢查clubId AuthorizeCore方法中(你必須手動得到clubId)或檢查你的行動代碼的訪問權限,即

if(User.IsInRole("Club" + clubId + "Admin")) 

你應該考慮將「Admin」角色和clubId分開,以便所有的clubadmins都具有「Admin」角色,並且它們都綁定到clubId(即在數據庫中有列)

+0

這仍然看起來錯了。他顯然不想檢查'clubId'是否是某個固定值,而是希望驗證綁定到該方法參數的'clubId'是否與角色名稱中的'clubId'完全相同。 –