2

我们有一个使用 Angular 构建的应用程序。并且应用程序触发后端 REST api 来显示数据。

问题是,

该应用程序使用 LDAP SSO 身份验证来验证用户(它是公司内部的应用程序,因此没有外部用户)

步骤是,

  1. 如果用户启动站点,它将重定向到 WebSec 登录,用户提供用户名和密码进行身份验证(隐式流)。

  2. 一旦成功验证,我们将从 WebSec 访问 JWT 令牌,该令牌将存储在会话存储中,并将用作后端服务的“承载”令牌。

  3. 后端服务有它的 WebSec 证书来验证他们身边的这个 JWT 令牌,如果没有,它将响应身份验证错误。

对于前端 - 我们正在使用 Angular 对于后端 - 我们是 Java,Sprint 启动。

问题是,

  1. 这是用户身份验证的正确方法吗?
  2. 如果是这样,隐式流的安全性如何。参考:https ://www.instagram.com/developer/authentication/ - 每个人都推荐显式流(服务器端调用)。我们的 UI 应用程序在不同的服务器中维护,后端服务在不同的服务器中维护。

如果有人对此提供解决方案,我将不胜感激。

4

2 回答 2

3

隐式流的问题是 JWT 令牌存在于 URL 中。隐式流程可以在您的前端或后端实现,不推荐两者,但在前端执行此操作有更多漏洞,如果我正确理解您的问题,这就是您正在尝试做的事情。

我将通过以下方式实现它。

  1. 您的前端将重定向到 WebSec 登录
  2. 成功登录后,WebSec 将重定向到您的后端
  3. 后端检索 JWT 令牌
  4. 后端创建一次性令牌并使用该一次性令牌重定向到您的前端
  5. 前端获取一次性令牌并将令牌POST到后端以获取JWT令牌
于 2019-07-19T09:08:47.507 回答
3

到目前为止,我看到的最好方法如下(我还运行了您所描述的 MS 单点登录服务器),但我建议它像 Discord 那样做:

  1. redirect_link您的前端使用 a和 a重定向到 SSOapplication_id并声明请求
  2. 您的 SSO 重定向到redirect_linkif Authentication is successful 并且application_idis known, but with a random createdcode=$myCode可能是 JWT 或任何长字符串
  3. 您的前端将此代码发送到您的后端,然后您的后端询问 SSO 服务器这是否有效code并请求一个真正的身份验证承载令牌。
  4. 如果一切正常,您的前端会从您的 API获取真正的身份验证令牌

如果这条链全部成功,您可以非常确定您的内部网络中的一切都很好。这对于公司内部来说是一个足够好的方法。

对于外部使用,您可以在第 1 步和第 2 步中提供一个安全密钥,sso 必须为从前端生成的前端提供回来,以确保此重定向来自您的 SSO。

编辑:有关加密的更多详细信息:

Your SSO encrypts the code maybe with HS512 which will be send to the client and later to the SSO again through the API. On this cycle if the SSO can decrypt and validate it and the API is a known/allowed communication partner you can say that all sides are trusted.

于 2019-07-24T12:31:33.737 回答