【问题标题】:How to organize communication in an asp.net web application using separate authorization server, web api, ui?如何使用单独的授权服务器、web api、ui 在 asp.net web 应用程序中组织通信?
【发布时间】:2019-11-29 16:49:15
【问题描述】:

要求

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

问题

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

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

其中一些是:

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

请您解释一下现代系统如何应对每个资源的访问?

感谢您的宝贵时间。

【问题讨论】:

    标签: c# asp.net-core architecture identityserver4 openid-connect


    【解决方案1】:

    首先,您需要确定声明是什么。

    声明不是权限或角色,它是用户。根据用户是什么,您可以假设权限。

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2016-03-28
      • 2018-10-15
      相关资源
      最近更新 更多