Asp.NET 基于核心声明的授权

Asp.NET Core Claim based Authorization

从现在开始,我一直在为 asp 使用基于角色的授权。我想学习基于策略和基于声明的授权。然后我意识到我可以将声明转换为类似“基于权限的 api 授权”之类的东西,我将其用于 NodeJs。我有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();

此代码块不检查将添加到数据库中的 Claim 的重复检查。我们可以使用 RoleManager 和 UserManager,但是是否有一个用于声明的 Manager?再次感谢。

有很多方法可以解决 authorization 问题,您所问的问题往往是可选的,最佳解决方案将根据不同的用例和开发人员自行实现而有所不同。由于我使用了所有角色、主张和政策,我将按照建议给出我的答案。

The scenario in my mind is this: Users have roles, and roles have claims. Then I will add Authorization policies which require claims. Is this a correct approach? Basically users won't have claims. (I have seen many approaches on net, that's why I am asking)

将角色视为一项重大要求。每当你看到一个角色,你就授予他们做一些事情的权限。就像您进入建筑物时,安全人员将有权检查您的基本个人信息。不管保安是谁,只要担任保安角色,他们就有权限索要你的论文。

To do that I created tables with switches. I will add a photo to so you can picture the scenario easily.

你有没有在 jwt 令牌中看到类似的东西

"someCustomClaim": ["ClaimOne", "ClaimTwo", "ClaimThree"],

想想这个声明将如何保存在像 sql 这样的关系数据库中,这就是那里没有唯一索引的原因。 但是,您始终可以添加一个,并强制每个声明都是唯一的,或者每个角色+声明都是唯一的,......一切都取决于您的用例。

We can use RoleManager and UserManager, but is there a Manager for claims?

声明如果单独存在就没有任何意义,必须附加 RoleUser 才有意义,对吧?

所以 UserManager(通过 UserClaims 声明)和 RoleManager(通过 RoleClaims 声明)就足够了,即使你处于一个需要多重角色的非常复杂的场景中 -声明和直接分配给用户的声明。

关于Policy,这是解决复杂授权场景的mixin方式,比如UserAuthenticated + Must have Internal Role + Must have Maintaination Claim + does not have fresher claim。如果您需要授权像这样复杂的端点...您可能会考虑将它们注册为策略。