繁体   English   中英

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

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

要求

  • 我们有 3 个模块uiapiIdentityServer ( IS ) ( clientresourceISIdentityServer
  • 所有模块都应该彼此分开( ISapi单独数据库)
  • api是无状态的(所有需要的身份验证信息都来自令牌)
  • api将拥有\\projects\\users等资源。
  • 将来可能会添加另一个入口点,例如another-ui ,它将与ISapi通信并拥有自己的声明

问题

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

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

他们之中有一些是:

  • 创建一个带有 id 的新项目应该授予该用户将来使用它的权利,因此我们需要以某种方式保存该用户的声明。 模块是分开的,所以我们应该调用IS api 为该用户创建该声明,然后继续创建项目。 应该如何组织两者( ISapi )之间的通信? 我们是否需要在IS中将api注册为另一个客户端?
  • IS中用户的更新应该如何更新,例如更改电子邮件、电话(可能登录的值)将更新api 我想显示身份验证电子邮件(从令牌中获得)与信息电子邮件不匹配的警告。

请您解释一下现代系统如何与每个资源访问相结合?

感谢您的时间。

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

声明不是权限或角色,而是用户。 根据用户是什么,然后您可以承担权限。

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

声明是一个名称值对,表示主题是什么,而不是主题可以做什么。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM