C# 基于动态角色的授权方法

C# 基于动态角色的授权方法,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个俱乐部表,当创建一个新的俱乐部时,会创建一个新角色Club(俱乐部id)Admin 我希望能够在方法的授权属性中引用此角色 以下是我在控制器方法上的尝试: [Authorize(Roles = "Club" + clubId + "Admin")] public ActionResult ClubDetails(int clubId) { var viewModel = db.Clubs .Where(t => t

我有一个俱乐部表,当创建一个新的俱乐部时,会创建一个新角色Club(俱乐部id)Admin

我希望能够在方法的授权属性中引用此角色

以下是我在控制器方法上的尝试:

        [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属性并在AuthorizeCore方法中检查clubId(您必须手动获取clubId),或者在操作代码中检查访问权限,即

if(User.IsInRole("Club" + clubId + "Admin"))

你应该考虑分解“管理员”角色和CulBID,这样你所有的CuBadmin都有相同的角色“admin”,它们都绑定到CulBID(即数据库中的一列)

不。你必须重写<代码> AuthigeAtgult类,以制作你自己的自定义属性。

[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
作为参数移动到属性的构造函数中。

那么,在绑定发生之前,授权属性在MVC管道中执行。您应该创建自己的授权筛选器。我会帮你的,这看起来还是不对的。显然,他不想检查
clubId
是否是某个固定值,而是想验证绑定到方法参数的
clubId
是否与角色名称中的
clubId
完全相同。非常感谢,是否有方法将其他角色添加到属性中,以便可以授权多个角色?我还需要将自定义属性定义放置在何处?将代码放置在需要的位置,以便可以从控制器访问该类。这应该是基本的。另外,根据需要修改核心代码,必要时传递其他参数。我的示例只是让您开始学习。我原以为可以,但我将它放在了控制器中,该控制器可用于我的方法,但它给出了以下错误:'GRCWebApp.Controllers.ClubController.CustomAuthorizationAttribute.AuthorizationCore(System.Web.HttpContextBase)“:在重写'protected'继承的成员'System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(System.Web.HttpContextBase)'时无法更改访问修饰符这确实是一个简单的问题,请将public更改为protected。”。