具有服务网关调用的SSO身份验证角度应用程序

时间:2019-07-19 04:07:10

标签: angular spring-boot ldap single-sign-on websecurity

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

问题是

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

步骤是

  1. 如果用户启动站点,它将重定向到WebSec登录名,其中用户提供用于验证的用户名和密码(隐式流程)。

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

  3. 后端服务具有其WebSec证书,可以在其一侧验证此JWT令牌,否则将以Authentication错误进行响应。

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

问题是

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

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

2 个答案:

答案 0 :(得分:1)

隐式流的问题是URL中存在JWT令牌。隐式流可以在前端或后端中实现,不建议两者都使用,但是如果正确理解问题,则在前端中执行隐式流将具有更多漏洞,这就是您想要做的事情。

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

  1. 您的前端将重定向到WebSec登录
  2. 成功登录后,WebSec将重定向到您的后端
  3. 后端检索JWT令牌
  4. 后端创建一个一次性令牌,并使用该一次性令牌重定向到您的前端
  5. 前端检索一次性令牌并将令牌发布到后端以检索JWT令牌

答案 1 :(得分:0)

到目前为止,我看到的最好的方法是以下操作(我也按照您的描述运行了MS Single Sign-On服务器),但是我建议它像Discord那样做:

  1. 您的前端使用redirect_linkapplication_id重定向到SSO,并声明请求
  2. 如果身份验证成功并且已知redirect_link,但是您随机创建了application_id,则您的SSO将重定向到code=$myCode,可以是JWT或任何长字符串
  3. 您的前端将此代码发送到您的后端,然后您的后端询问SSO服务器这是否是有效的code,并请求一个真实的身份验证承载令牌。
  4. 如果一切正常,您的前端将从您的API
  5. 获取真实的身份验证令牌

如果这个链条都成功,那么您可以确定内部网络中的一切都很好。对于公司内部而言,这是一个足够好的方法。

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

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

您的SSO可能使用HS512加密代码,该代码将被发送到客户端,然后再通过API再次发送到SSO。在这个周期中,如果SSO可以解密和验证它,并且该API是已知/允许的通信伙伴,则可以说所有方面都是受信任的。