ASP.NET Core 中的声明基础方法

Claim base approach in ASP.NET Core

我们想构建一个基于权限的应用程序。管理员可以在哪里设置用户可以做什么或不可以做什么。

例如,在组织 A 中,管理员可以将 User1 设置为仅 CreateToolsEditTools查看工具User2 只能做 CreateToolsViewTools.

而在 Organization-B 中,此处的管理员将 John 设置为 CreateToolsViewSales(出于某种原因,这里的管理员不允许 John 到 ViewTools)

如您所见,这些不是用户的角色,而是每个用户的权限。

此外,页面上的链接(锚标签)将根据其权限显示。例如,User1 登录后,他只能看到 CreateToolsEditToolsViewTools[=49= 的链接]

我们认为,至少对我们来说,这是一条快乐的道路(或者这会是痛苦的吗?请对此发表评论)。因为我们想将此扩展到每个想要使用我们的应用程序的组织,并帮助他们根据自己的喜好设置权限。

我们打算构建它的方式是通过 Web Api(ASP.NET 核心),它将被客户端(浏览器。SPA 应用程序)使用

我之前尝试过的方法是使用 ASPNET MVC 5 并使其具有标识脚手架并从那里构建应用程序。但这是基于角色的东西。

我已经阅读了有关基于声明的方法并看到了这个 blog(非常有帮助),但对于我来说如何使用数据库和身份来实现它并不明显。另请阅读 JWT 的工作原理。

对我们来说,这是至关重要的部分,但是一旦我们开始了解它是如何工作的。我们将从那里构建应用程序。

任何教程、链接、博客。意见或建议将非常有帮助。或者我们应该研究的术语。

我个人会看一下开源项目 IdentityServer,当前发布的版本是版本 3,但是托管在 Asp.Net Core 中的版本 4 最近已达到发布候选状态。

架构概述

IdentityServer 项目将为您提供 Security Token Service (STS),然后可用于为 MVC 页面、Web API 等资源提供基于令牌的保护电话、移动应用程序等

ClientsScopesClaims 定义了可以使用 STS 进行基于令牌的身份验证的应用程序、它们可以请求的信息类型以及实际声明(例如作为用户名、电子邮件地址等);这些声明由 Identity Provider 存储,数据库后端与 STS 本身是分开的。

STS 的任务是提供两个标准的实现,OpenID ConnectOAuth2

STS 将查询 Identity Provider 以对用户进行身份验证,并构建一个可以包含与该用户相关的声明的令牌。这些令牌由每个 Client 中配置的中间件解码,提取的 Claims 可用于授权访问,可选择与 ASP.Net Core Policies 结合使用,这种方法将为您提供全面的令牌和基于声明的安全架构。

参考 material、示例和演练

我强烈建议您首先检查 IdentityServer3, and perhaps more specifically IdentityServer4 的文档和示例。这些解释了术语,并包含全面的示例和实施演练。

Dominick Baier,IdentityServer 的合著者,概述了 OpenID ConnectOAuth2 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 Core Identity,如果需要,可以对其进行自定义以支持多租户。

可以找到一套全面的 IdentityServer4 快速入门 here, including specifically the use of ASP.Net Core Identity and Entity Framework to store data in SQL Server here

每个快速入门的完整源代码可在 GitHub here.

上找到

授权策略

关于授权,我建议 AspNetAuthorizationWorkshop 在 GitHub 上解释基于声明的身份验证和授权的各个方面,特别是包括使用新的 ASP.Net 核心授权策略可以根据声明指定细粒度规则,方法是检查单个用户声明集的任意组合以查看它们是否满足安全标准 - 以及可选的传统角色,这也可用于减少管理开销。

总结

综上所述,您可以按照上述建议创建:

  1. 用户声明的数据库存储库,基于 ASP.Net 核心身份。

  2. 用于验证用户身份并提供安全令牌服务 使用 IdentityServer 的包含声明的令牌。

  3. 一组针对用户评估规则的授权策略 声明(如果您选择混合方法,还有角色)。

安全是一个复杂的领域,乍一看可能让人望而生畏。但是,Dominick Baier 和 Brock Allen 都是公认的行业专家,他们提供了一系列很好的介绍和代码示例,并且他们的项目IdentityServer 被 Microsoft 推荐用于基于声明的身份验证。