基于方法的动态角色授权

本文关键字:动态 角色 授权 方法 于方法 | 更新日期: 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(即在数据库中有一列)