基于方法的动态角色授权
本文关键字:动态 角色 授权 方法 于方法 | 更新日期: 2023-09-27 18:02:23
我有一个俱乐部表,当创建一个新的俱乐部时,创建一个新的角色Club(俱乐部的id)Admin。
我希望能够在方法的authorization属性中引用这个角色。
这是我在控制器方法上所做的尝试:
[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);
}
但是这会在authorise属性中的clubId上给出错误。名称clubId在当前上下文中不存在
是否有一种方法可以引用传递给authorise属性中的方法的参数?
No。你必须重写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
作为参数移动到属性的构造函数中
不能将动态数据传递给属性。要解决您的问题,您可以继承Authorize属性并在AuthorizeCore方法中检查clubId(您必须手动获取clubId),或者在您的操作代码中检查访问权限,即
if(User.IsInRole("Club" + clubId + "Admin"))
您可能应该考虑拆分"Admin"角色和clubId,以便所有的clubadmins都具有相同的角色"Admin",并且它们都绑定到clubId(即在数据库中有一列)