【问题标题】:Azure AD, Angular Spa and Spring Microservice IntegrationAzure AD、Angular Spa 和 Spring 微服务集成
【发布时间】:2021-04-09 19:00:38
【问题描述】:

我们使用 Azure AD 进行身份验证和授权。我们的 angular spa 已通过 Azure AD 启用 SSO。我们需要保护我们的后端 服务,并且只允许具有有效 jwt 令牌的 API。

到目前为止,我们所做的是:

  1. 在 Azure AD 中注册了我们的 Angular 应用。

  2. 我们已经将 spring 微服务配置为资源服务器,并且 应用程序属性包含 jwt.issuer-uri

    spring.security.oauth2.resourceserver.jwt.issuer-uri=XXXXXXXXXXX-XXXXXXXXX-XXXXXXX-XXXXXXXXXXXX

问题是我们从 Azure AD 获得的令牌的受众为 "00000003-0000-0000-c000-000000000000",这意味着该令牌是为 Microsoft 图表生成的。我还尝试使用此令牌访问图形 Api,它起作用了。但是我们想要的是在我们自己的spring微服务中验证这个token并授予权限 基于提供的 jwt。

为了解决这个问题,我必须在我们的 Azure 注册 Angular 应用程序中进行一些配置更改。我添加了一个自定义 scope api:///app 并使用 获取令牌时的此范围。现在令牌正在后端验证,API 工作正常。

此配置以某种方式有效,但对我来说似乎不正确。我是 azure 的新手,所以不确定所有的东西是如何联系起来的。

  1. 现在正在生成的新令牌的受众是我们的 角度温泉客户端ID。这个对吗?不应该是后台吗 服务?任何为什么它会被后端验证 当前配置?
  2. 我的理解是我们不必注册我们的spring 带有 Azure 广告的微服务。我将只充当资源服务器 将使用 发行者网址。
  3. 如果我们需要使用 azure AD 注册我们的后端服务,那么 对所有微服务都做同样的事情会不会很困难?

我已经通过引用完成了所有设置。 https://ordina-jworks.github.io/security/2020/08/18/Securing-Applications-Azure-AD.html

在其他一些链接中,我发现用于设置后端服务的配置完全不同。我不确定哪一个是正确的。 https://docs.microsoft.com/en-us/java/api/overview/azure/active-directory-spring-boot-starter-readme?view=azure-java-stable

【问题讨论】:

    标签: azure spring-boot spring-security oauth-2.0 azure-active-directory


    【解决方案1】:

    在遵循基于标准的方法时,Azure AD 有点令人困惑。几年前我为此写了blog post

    • 您已经发现至少需要一个 API 注册才能工作,以公开 API 范围 - 以便获得可用的访问令牌

    • 然后,从 Azure 中的 API 条目生成的 id 将成为您的受众,如本文的第 9 步。

    我们真正想做的是这样,这样我们就可以将微服务中的 JWT 转发到微服务调用:

    • 让 Azure AD 发出所有微服务通用的受众声明,例如 api.mycompany.com

    • 根据微服务中的数据区域在访问令牌中发布多个范围 - 如this Curity doc

    我的目标是在 Azure AD 中使用一个条目来代表您的 API 平台。然后每个微服务可以使用相同的生成受众价值。

    希望您也可以使用多个自定义范围,尽管这里有一些烦恼,尤其是当您想要使用 Azure AD 通过 Graph API 公开的内置 OpenID Connect 用户信息范围时。

    【讨论】:

    • 感谢您回复和分享有用的信息。还有一个后续问题,正如我所说,到目前为止,我只在 Azure AD 中注册了 Angular SPA,还没有为 API 注册任何应用程序。相反,我所做的是在已注册的 Angular SPA 应用程序中公开了一个新的 Api 范围。所以现在在我的访问令牌中,我让观众与我在 Azure 中的 Angular SPA 客户端 ID 相同。但我不确定为什么后端服务会成功验证此令牌。也许默认情况下不验证观众
    • 从您的帖子中,我了解到我需要为 API 创建一个新的应用注册并将其添加到 SPA 的 API 权限中,以便访问令牌包含作为 Azure 后端 API 客户端 ID 的受众。然后在每个微服务上强制执行自定义验证以验证受众。就像你说的,甚至我也在同一个页面上,在所有微服务中使用相同的令牌。但从安全角度来看,这是一种正确的方法吗?从 Angular SPA 用户被授予一个令牌来调用资源服务器“A”上的 API“X”,但他可以使用相同的令牌来调用资源服务器“B”上的 API“Y”。
    • 另一方面,如果我不在微服务之间使用相同的令牌,那么总是在资源服务器 A(spring 微服务)中生成一个新的令牌来调用一个 Rest 端点会非常乏味资源服务器 B. 同样在这种情况下,角度应用程序需要有一些逻辑来从 azure AD 动态获取令牌,用于不同的 Azure Ad 注册后端 Api 应用程序(Azure AD 中每个微服务的不同应用程序注册),具体取决于哪个资源服务器用户调用了 API 调用。
    • 作为默认机制,访问令牌被设计为在微服务之间发送。例如,用户使用范围“orfers + shipping”进行身份验证,然后 UI 调用订单服务,该服务又调用运输服务。这提供了一个方便的编码模型。
    • 例外情况是当 UI 想要做一些高权限的事情,比如支付。在这种情况下,再次重定向用户以获得不同类型的令牌是有意义的。但在大多数情况下,使用单个令牌。
    猜你喜欢
    • 2015-03-22
    • 2021-02-22
    • 2022-10-25
    • 1970-01-01
    • 2017-02-24
    • 2018-12-03
    • 2021-06-18
    • 2022-01-20
    • 2021-11-08
    相关资源
    最近更新 更多