我正在使用ASP.NET Core 2.1
我有一个抽象的控制器基类,它具有CRUD操作的基本实现。我们希望将其中大多数限制为仅对某些用户(例如具有Admin角色的用户)可调用,而允许某些用户或其他角色使用。
它会以这种方式工作吗?
[Authorize(Roles = "Admin")]
abstract class BaseController<T> : Controller
{
public virtual IActionResult GetAll() { }
public virtual IActionResult Create(T entity) { }
public virtual IActionResult Read(int id) { }
public virtual IActionResult Delete(int key) { }
}
[Authorize(Roles = "ClassRole")]
class EntityController : BaseController<Entity>
{
[AllowAnonymous]
public override IActionResult GetAll() { } //callable by anyone?
//Create not overriden so callable only by Admins (and/or ClassRole?)
public override IActionResult Read() //overridden but no attribute so ClassRole?
[Authorize(Roles = "MehodRole")]
public override IActionResult Delete() { } //all 3 (Admin, ClassRole, MethodRole) or something?
}
如果基类中还存在其他Authorize属性,并且一个属性中有多个角色,则只会变得疯狂。
谢谢
答案 0 :(得分:0)
如果您正在使用身份,就可以轻松实现,但是如果要自定义角色身份验证,则可以查看本文https://docs.microsoft.com/tr-tr/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.1
答案 1 :(得分:0)
编辑:正如OP所暗示的,我误解了他的问题。
如果您不想使用多个授权属性,则必须使用自定义策略。您可以找到示例here。然后,您可以在策略中使用一个授权属性。
[Authorize(Policy = "MyRoleRequirementPolicy")]
在该策略中,您检查所需的角色。您可以拥有比身份验证更大的逻辑。在启动代码中,您只需添加类似的策略
services.AddAuthorization(options =>
{
options.AddPolicy("MyRoleRequirementPolicy", policy =>
policy.Requirements.Add(new CheckRolesPolicy(role1, role2, role3))); // you can register them with multiple roles under different names as often as you want
});
始终可以在基本实现中使用此行为。如果您将其他属性添加到派生的控制器或特定的端点,则基本行为将被忽略。
在这种情况下,为什么我认为继承不是一个好主意:
这只是我的意见。您的工作完全取决于您:)
上一个答案:我不建议使用带有Authorize属性的基本控制器。 无论如何,您可以在一个函数上拥有多个授权属性
[Authorize(Roles = "Admin")]
[Authorize(Roles = "ClassRole")]
[Authorize(Roles = "MehodRole")]
public override IActionResult Delete() { }