C# 基于动态角色的授权方法
我有一个俱乐部表,当创建一个新的俱乐部时,会创建一个新角色Club(俱乐部id)Admin 我希望能够在方法的授权属性中引用此角色 以下是我在控制器方法上的尝试: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
[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。”。