与遗留系统(Forms Auth、ADFS、AD)集成的身份服务器(OAuth2)实施

Identity Server(OAuth2) implementation with integration to legacy systems(Forms Auth, ADFS,AD)

我们目前正在构建 RESTful API(.Net Core, IdentityServer 4, EF6)。我们已经发布了它的 MVP 版本。

它还引用了 WCF 服务。此 WCF 服务协调对其他内部(遗留系统)和其他集成组件的所有其他调用。

(可能是错误的)实现概览图如下:

我们遇到的主要问题之一是弄清楚如何使用 Identity Server 集成不同的身份验证和授权系统...

特别是内部服务到服务调用。我们是否使用相同的 IdentityServer 来执行 多项功能?(public 消费者授权和身份验证以及内部服务到服务授权) .

传统上我们使用不同的 WCF 安全配置(传输、TransportWithMessageCredentials...等等),添加表单、AD、ADFS 和服务帐户。我们需要确保我们正在做出正确的调用以实现可重用的 IdentiyServer 实现。

总之,我们的挑战是如何进行内部服务授权?

  1. 拥有一个中央身份服务器实现来处理 public 面向请求和内部(多跳)服务到服务授权的做法是好的做法吗?
  2. 您是否建议将内部服务到服务授权的身份服务器与处理 public 面向 API 请求的身份服务器分开并使用单独的身份服务器?
  3. 或者我们是否进一步为每个应用程序用例拆分和创建不同的身份服务器?

首先我会说你将不得不经常用头撞墙。

我认为理想的情况是您只支持一个身份提供者,例如 Active Directory。 Microsoft 希望您相信他们的解决方案很简单,但事实并非如此。这就是为什么如果您必须同时支持遗留身份提供程序和新系统,您将遭受更多损失。

次要解决方案是保留旧的身份提供程序系统并通过它实施新的 API。我想它一定是托管在您自己的资源上的自定义解决方案。缺点是没有内置功能,每个新需求都必须从头开始构建。

老实说,如果您可以从新系统中隔离(或删除)旧系统,您将在维护和延展性方面获得长期的巨大好处。

我会先看看 code samples 再做决定。在朝任何方向花费数周之前更好地了解交易破坏者。

以下是我对可靠实施计划的看法。

  1. 拥有一个中央 Identity Server 实现来处理 public 面向请求和内部(多跳)服务到服务授权是一种好的做法吗?

    共享实现的原因:

    • 更简单的解决方案

    单独实施的原因:

    • 外部与内部的不同安全要求users/clients
    • 外部中断不会影响内部 users/clients

    推荐: 在短期内,使用一个既能为目标服务的实现 将它们分成外部和内部重点领域。


  1. 您是否建议将内部服务到服务授权的身份服务器与处理面向 public 的 API 请求的身份服务器分开并使用单独的身份服务器?

    推荐: 长期是的。原因见上。


  1. 或者我们是否进一步为每个应用程序用例拆分和创建不同的身份服务器?

    推荐: 不,从长远来看,为每个 client/use 个案例创建一个单独的身份服务器将更难管理。您将为每个 application/scenario 创建单独的客户端。 (即移动客户端、MVC 网站、内部服务器到内部服务器、外部 API/Service 到内部 API/Service [想想 B2B 接口])


您将想要了解 client types and how to allow extension grants,这是当直接 API 调用需要作为用户调用辅助 API 时使用的客户端凭据。

以上是我对上述问题的看法

  1. 用于内部服务的独立身份服务器
  2. 为内部服务分离身份服务器有更多优点,即

    中断 & 配置更改 将来不会影响消费者。 出于测试目的,如果您尝试支持遗留应用程序,则最好使用单独的身份服务器

    新服务器 具有长期优势和安全性增强。