. NET Core MVC项目,具有基于角色的授权。我的系统中有5个不同的角色。基于角色,任何用户都可以访问不同的section/操作。
我当前的实现看起来是这样的。
[Authorize(Roles = "Admin,Supervisor,SeniorContributor,Contributor,SeniorConsumer,Consumer")]
public async Task<IActionResult> Index()
{
..
}
[Authorize(Roles = "Admin,Supervisor,SeniorContributor,Contributor")]
public async Task<IActionResult> Edit(int Id)
{
..
}
[Authorize(Roles = "Admin")]
public async Task<IActionResult> DeleteConfirmed(int Id)
{
..
}
正如您所看到的,我在授权属性中提到了角色作为字符串。这是正确的方法吗?或者我将它存储在某个enum中并在这里使用它,或者这样做的最佳实践是什么?
我认为这实际上是一个非常好的问题。这些基于属性/注释的解决方案经常被供应商宣传,但它们存在可维护性、可扩展性和客户端问题,所以我个人总是避免使用它们。
使用标准模式
将授权逻辑放在易于适应更改的类中,并且是可测试的:
- 适用于所有端点的规则的过滤器类
- 应用于端点子集的策略类
- 在每个方法中使用特定的代码
这些选项还可以让您更好地控制返回给客户端的错误响应,并且以一致的方式使其工作非常重要—例如属性403响应不应该使用与其他授权检查不同的错误格式。
。Net实际上有一些很好的API策略特性,就像在这个代码示例中一样,但我不知道你是否可以在web后端使用它。
ROLES AND CLAIMS
在。net中,角色只是一个字段—您应该确保您的授权逻辑能够访问完整的claimprincipal。这将在授权规则(和角色名称)更改时为您提供最佳选项。