Asp.Net Core / IdentityServer 复杂授权

Asp.Net Core / IdentityServer Complex Authorization

对于我正在进行的项目,我需要创建两个独立的(但并非完全不相关的)应用程序,并使用一个公共身份服务器。为此,我选择了 IdentityServer4,它对我来说效果很好。

但是,我需要能够将用户分配给多个 companies/projects(是的,这是一个真实的案例)并且可能在每个用户中分配不同的角色。但是,我无法为此设计索赔结构。

我看到有两种方法可以解决这个问题;

  1. 为每个 company/project 创建一个复杂的声明,其中将包含 companyId 和用户在该公司的角色。可以是 JSON 形式或像 companyGUID_roleClaim 这样的自定义字符串 然而,当我对此做了一个小的研究时,我意识到有很多人认为这不是正确的方法,因为他们认为声明应该是简单的键值对。

  2. 让应用程序 connect/query 身份数据库 检索与活动用户关联的 companies/projects 和角色,并使用以下方法保护资源基于这些数据的政策。

也许我从错误的角度看待它,或者这两者之一是可以接受的。或者有另一种解决方案。你能帮我找到解决这个问题的方法吗?

如果您打算使用第一种方法,您可能 运行 会遇到一些问题。您在声明中指定的角色在您的两个并非完全不相关的应用程序中可能具有不同的含义。

声明代表用户的身份,而不是 he/she 允许访问的内容。

您可以编写一个授权服务,从数据库中提供所需的授权数据。比您可以通过编写授权策略在两个应用程序中进行授权。您可以通过使用 [Authorize(Policy="MyPolicy"].

去除资源来保护您的资源

leastprivilege 写了一篇关于它的不错的博客以及为什么你不应该使用权限声明: https://leastprivilege.com/2016/12/16/identity-vs-permissions/