基于动态角色的方法授权
我有一个俱乐部表,当一个新的创建一个新的角色创建俱乐部(俱乐部的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属性中方法的参数?
不需要。您必须覆盖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
该属性的构造函数作为参数。
非常感谢,有没有一种方法可以将其他角色添加到属性中,以便可以授权多个角色? –
另外我需要放置自定义属性定义? –
将代码放在需要的位置,以便可以从控制器访问该类。这应该是基本的。另外,可以根据需要修改核心代码,并根据需要传递其他参数。我的例子只是为了让你开始。 –
您无法将动态数据传递给属性。 解决你的问题,你可以继承授权属性和检查clubId AuthorizeCore方法中(你必须手动得到clubId)或检查你的行动代码的访问权限,即
if(User.IsInRole("Club" + clubId + "Admin"))
你应该考虑将“Admin”角色和clubId分开,以便所有的clubadmins都具有“Admin”角色,并且它们都绑定到clubId(即在数据库中有列)
这仍然看起来错了。他显然不想检查'clubId'是否是某个固定值,而是希望验证绑定到该方法参数的'clubId'是否与角色名称中的'clubId'完全相同。 –
好吧,授权属性在绑定发生之前在MVC管道中执行。你我应该创建你自己的授权过滤器。 [这个答案](http://stackoverflow.com/a/12828402/1849444)将帮助你我。 –