如何使用单独的授权服务器、web api、ui 在 asp.net web 应用程序中组织通信?

How to organize communication in an asp.net web application using separate authorization server, web api, ui?

要求

问题

主要问题是 api 的资源,如 \projects345\users\\projects3456\users 等,也可能需要 [=16= 中的声明] ].例如,api 模块读取授权用户的访问令牌并查看等于 ["222", "12345"] 的声明 projects,因此允许资源 \projects345\projects3456\users那个用户。 用户同时是IS中的身份和api中的资源。项目同时是 IS 中的声明和 api 中的资源。

我想到了通过 id (guid) 记录在两个模块中表示的这些实体。但 id 并不能解决所有问题。

其中一些是:

请您解释一下现代系统如何处理每个资源访问?

感谢您的宝贵时间。

首先您需要确定什么是索赔。

声明不是权限或角色,它是用户的身份。根据用户的身份,您可以承担权限。

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-3.0

A claim is a name value pair that represents what the subject is, not what the subject can do.

因此,从那开始,您可以获得声明并执行以下操作。

假设用户是项目的所有者。创建新项目时,项目 api 可以更新身份服务器并向用户添加声明,说明他是所有者。

在您 api 年代,项目所有者拥有一组权限,并基于这些权限访问特定资源

在 DDD 领域驱动的设计世界中,一点点数据重复并不重要。因此,根据角色(同样,不是 id,而是一个或多个声明到特定角色的映射)复制您的应用程序可能需要的声明并不是一个坏习惯。

当您从 api 更新某种声明时,您应该以交易方式进行。首先考虑一下您是否需要将电子邮件保存在两者中。无论如何,您都会在每次请求时从声明中获取用户数据。它甚至是你需要的东西作为索赔吗?如果没有,仅在您的 api 中。

api 之间的交流以多种方式组织。如果您需要事务或最终一致性,您还应该考虑。与事件或队列通信是微服务的方式,SAGA 等模式是协调器。