方法

时间:2015-07-12 18:02:41

标签: c# asp.net-mvc

我有一个俱乐部表,当一个新的俱乐部被创建时,新的角色被创建俱乐部(俱乐部的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属性中传递给方法的参数?

2 个答案:

答案 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(即数据库中的列)