c# - Asp.NET Core 基于声明的授权
问题描述
从现在开始,我一直在使用基于角色的 asp 授权。我想学习基于策略和基于声明的授权。然后我意识到我可以将声明变成我用于 NodeJs 的“基于权限的 api 授权”之类的东西。我有2个问题要了解基础知识,谢谢。
问题一:我脑海中的场景是这样的:用户有角色,角色有声明。然后我将添加需要声明的授权策略。这是一个正确的方法吗?基本上用户不会有索赔。(我在网上看到了很多方法,这就是我问的原因)
问题 2:为此,我创建了带有开关的表。我将添加一张照片,以便您可以轻松地描绘场景。 但是当我使用:
var role = await roleManager.FindByIdAsync(RoleId);
await roleManager.AddClaimAsync(role,new Claim("Permission 1", "perm explanation"));
List<IdentityRoleClaim<string>> allClaims = _db.RoleClaims.ToList();
此代码块不检查将添加到数据库的声明的重复检查。我们可以使用 RoleManager 和 UserManager,但是是否有一个 Manager 用于索赔?再次感谢你。
解决方案
有很多方法可以解决authorization
问题,你所问的往往是可选的,最好的解决方案是根据各种用例和开发者自己实现它们的差异。由于我使用了所有角色、声明和政策,因此我将按照建议给出我的答案。
我脑海中的场景是这样的:用户有角色,角色有声明。然后我将添加需要声明的授权策略。这是一个正确的方法吗?基本上用户不会有索赔。(我在网上看到了很多方法,这就是我问的原因)
将角色视为一项重大要求。每当你看到一个角色时,你就授予他们做一些事情的权限。就像当您进入建筑物时,保安有权检查您的基本个人信息。保安是谁并不重要,只要他们担任保安职务,他们就有权要求您提供论文。
为此,我创建了带有开关的表。我将添加一张照片,以便您可以轻松地描绘场景。
你有没有在 jwt 令牌中看到过类似的东西
"someCustomClaim": ["ClaimOne", "ClaimTwo", "ClaimThree"],
想想这个声明将如何保存在像 sql 这样的关系数据库中,这就是为什么那里没有唯一索引的原因。但是,您始终可以添加一个,并强制每个声明都是唯一的,或者每个角色+声明都是唯一的,......一切都取决于您的用例。
我们可以使用 RoleManager 和 UserManager,但是是否有一个 Manager 用于索赔?
声明如果单独存在就没有任何意义,它必须附加Role
或User
有意义,对吗?
因此UserManager
,(通过 UserClaims 进行声明)和RoleManager
(通过 RoleClaims 进行声明)已经足够好了,即使您在一个非常复杂的场景中需要多个角色 - 声明和直接分配给用户的声明。
关于Policy,这是解决复杂授权场景的混合方式,例如UserAuthenticated +必须具有内部角色+必须具有维护声明+没有更新声明。如果您需要授权像这样复杂的端点......您可以考虑将它们注册为策略。
推荐阅读
- java - Spring Boot Starter Web Dependency 给出缺少工件的错误
- swift - NavigationBar 和 TableView 之间的额外空间
- python - TypeError:将形状转换为 TensorShape 时出错:只接受大小为 1 的数组
- java - 即使表单字段留空,也会提交空字符串并在 Spring 中创建新实体
- python-3.x - sock.bind() - TypeError: 需要一个整数
- node.js - 在节点 js Web 应用程序中为用户组创建模型
- amazon-web-services - 我们可以使用 GCP composer 与 windows 实例通信吗?
- python - 如何在 Python3 中检查域详细信息?
- haskell - QuickCheck 组合器,用于在给定范围内缩小长度列表
- istanbul - 什么是纽约伊斯坦布尔的仪器仪表?