2015-07-12 89 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'完全相同。 –