我们希望构建基于权限的应用。管理员可以设置的内容,例如用户可以做什么或不做什么。
说,在组织A中,管理员可以将User1
设置为仅 CreateTools , EditTools 和 ViewTools 。 User2
只能执行 CreateTools 和 ViewTools 。
在Organization-B中,管理员将John
设置为 CreateTools , ViewSales (出于某种原因,管理员不允许{{} 1}}到ViewTools)
正如您所注意到的,这些不是用户的角色,而是每个用户的权限。
此外,页面上的链接(锚标记)将根据其权限显示。说,John
登录,他只能看到 CreateTools , EditTools 和 ViewTools
我们认为,对我们来说,至少是幸福的道路(或者这会是痛苦的吗?请对此发表评论)。因为我们想在每个想要使用我们的应用程序的组织上扩展它,并且只是帮助他们根据自己的喜好设置权限。
我们打算构建它的方式是通过Web Api(ASP.NET Core),它将被客户端使用(浏览器.SPA应用程序)
我之前尝试过的,使用ASPNET MVC 5并使用身份构建脚手架并从那里构建应用程序。但那是基于角色的东西。
我已经阅读了基于声明的方法并看到了这个blog(非常有帮助),但对于我如何使用数据库和身份来实现它并不明显。另请阅读JWT的工作原理。
对我们来说,这是至关重要的部分,但一旦我们开始了解它是如何运作的。我们将从那里构建应用程序。
任何教程,链接,博客。评论或建议将非常有帮助。或者我们应该研究的术语。
答案 0 :(得分:3)
就个人而言,我会看一下开源项目IdentityServer
,当前发布的版本是版本3,但是在Asp.Net Core中托管的版本4最近已经获得了候选版本状态。
架构概述
IdentityServer
项目将为您提供Security Token Service
(STS),然后可用于为资源提供基于令牌的保护,例如MVC页面,Web API调用,移动应用程序等。
Clients
,Scopes
和Claims
定义可以使用STS进行基于令牌的身份验证的应用程序,可以请求的信息类型以及实际的声明(例如用户)姓名,电子邮件地址等);这些声明由Identity Provider
与数据库后端存储,后端与STS本身分开。
STS的任务是提供两个标准OpenID Connect
和OAuth2
的实施。
STS将查询Identity Provider
以验证用户身份,并构造可包含与该用户相关的声明的令牌。这些令牌由每个Client
中配置的中间件解码,提取的声明可用于授权访问,可选地与ASP.Net Core Policies一起使用,这种方法将为您提供全面的令牌和基于声明的安全架构。
参考资料,样本和演练
我强烈建议您首先检查IdentityServer3的文档和示例,或者更具体地说IdentityServer4。这些解释了术语,并包含了实施的全面示例和演练。
IdentityServer
的共同作者Dominick Baier概述了OpenID Connect
和OAuth2
here。
了解基于令牌的身份验证的工作原理后,您应该继续检查如何配置支持您的方案的Identity Provider
。
有多个Identity Provider
项目可用于插入IdentityServer3
,包括ASP.Net Identity。 Brock Allen(也是IdentityServer
的联合创始人)创建了用于存储声明等的Membership Reboot和Identity Reboot项目,以及为用户管理提供管理门户的Identity Manager。可以在以下链接中找到每种解释:
Identity Reboot by Brock Allen
Introducing Identity Manager by Brock Allen
Identity Manager walkthrough by Scott Brady
IdentityServer4
目前支持ASP.Net核心身份,如果需要,可以自定义以支持多租户。
可以找到一组全面的IdentityServer4
快速入门here,具体包括使用ASP.Net Core Identity
和Entity Framework
在SQL Server
{{3}中存储数据}}
GitHub here上提供了每个快速入门的完整源代码。
授权政策
关于授权,我建议在GitHub上here解释基于声明的身份验证和授权的各个方面,特别是包括使用新的ASP.Net核心授权策略,这些策略可以指定基于的细粒度规则声明,通过检查单个用户集的任意组合声明他们是否符合安全标准 - 以及可选的传统角色,也可用于减少管理开销。
结束
总之,您可以按照上述建议创建:
基于ASP.Net核心身份的用户声明的数据库存储库。
用于验证用户和提供的安全令牌服务 包含声明的令牌,使用IdentityServer。
一组授权策略,用于评估针对用户的规则 声明(如果您选择混合方法,还可以使用角色)。
安全是一个复杂的领域,起初看起来非常艰巨。但是,Dominick Baier和Brock Allen都是公认的行业专家,他们提供了一系列良好的介绍和代码示例,Microsoft推荐他们的项目IdentityServer
用于基于声明的身份验证。