首页 > 解决方案 > 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 用于索赔?再次感谢你。

标签: c#asp.net-coreasp.net-identity

解决方案


有很多方法可以解决authorization问题,你所问的往往是可选的,最好的解决方案是根据各种用例和开发者自己实现它们的差异。由于我使用了所有角色、声明和政策,因此我将按照建议给出我的答案。

我脑海中的场景是这样的:用户有角色,角色有声明。然后我将添加需要声明的授权策略。这是一个正确的方法吗?基本上用户不会有索赔。(我在网上看到了很多方法,这就是我问的原因)

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

为此,我创建了带有开关的表。我将添加一张照片,以便您可以轻松地描绘场景。

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

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

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

我们可以使用 RoleManager 和 UserManager,但是是否有一个 Manager 用于索赔?

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

因此UserManager,(通过 UserClaims 进行声明)和RoleManager(通过 RoleClaims 进行声明)已经足够好了,即使您在一个非常复杂的场景中需要多个角色 - 声明和直接分配给用户的声明。

关于Policy,这是解决复杂授权场景的混合方式,例如UserAuthenticated +必须具有内部角色+必须具有维护声明+没有更新声明。如果您需要授权像这样复杂的端点......您可以考虑将它们注册为策略。


推荐阅读