我有一个俱乐部表,当一个新的俱乐部被创建时,新的角色被创建俱乐部(俱乐部的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);
}
但是在authorize属性中,clubId会出错。名称clubId在当前上下文中不存在
有没有办法可以引用在authorize属性中传递给方法的参数?
答案 0 :(得分: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
作为参数移动到属性的构造函数中。
答案 1 :(得分:0)
您无法将动态数据传递给属性。 要解决您的问题,您可以继承Authorize属性并检查AuthorizeCore方法中的clubId(您必须手动获取clubId)或检查您的操作代码中的访问权限,即
if(User.IsInRole("Club" + clubId + "Admin"))
您应该考虑拆分“管理员”角色和clubId,以便您的所有俱乐部管理员具有相同的角色“管理员”,并且他们都绑定到clubId(即数据库中的列)