具有服务网关调用的 SSO 身份验证 Angular 应用程序
Posted
技术标签:
【中文标题】具有服务网关调用的 SSO 身份验证 Angular 应用程序【英文标题】:SSO authentication angular application with service gateway call 【发布时间】:2019-11-28 00:45:27 【问题描述】:我们有一个使用 Angular 构建的应用程序。并且应用程序触发后端 REST api 来显示数据。
问题是,
应用程序使用 LDAP SSO 身份验证来验证用户(它是公司内部的应用程序,因此没有外部用户)
步骤是,
如果用户启动站点,它将重定向到 WebSec 登录,用户提供用户名和密码进行身份验证(隐式流)。
一旦身份验证成功,我们将从 WebSec 获取 JWT 访问令牌,该令牌将存储在会话存储中,并将用作后端服务的“承载”令牌。
后端服务有它的 WebSec 证书来验证他们这边的这个 JWT 令牌,如果没有,它会响应身份验证错误。
对于前端 - 我们正在使用 Angular 对于后端 - 我们是 Java,Sprint 启动。
问题是,
-
这是用户身份验证的正确方法吗?
如果是这样,隐式流的安全性如何。参考:https://www.instagram.com/developer/authentication/ - 每个人都推荐显式流(服务器端调用)。我们的 UI 应用程序在不同的服务器中维护,后端服务在不同的服务器中维护。
如果有人对此提供解决方案,我将不胜感激。
【问题讨论】:
您的 LDAP SSO 是否支持显式流? 您是否可以对您的 LDAP SSO 进行任何更改? 【参考方案1】:到目前为止,我看到的最好的方法如下(我还运行了您所描述的 MS 单点登录服务器),但我建议它像 Discord 那样做:
-
您的前端使用
redirect_link
和 application_id
重定向到 SSO 并声明请求
如果身份验证成功并且 application_id
已知,但您的 SSO 将重定向到 redirect_link
,但随机创建的 code=$myCode
可能是 JWT 或任何长字符串
您的前端将此代码发送到您的后端,然后您的后端会询问 SSO 服务器这是否是一个有效的 code
并请求一个真正的身份验证承载令牌。
如果一切顺利,您的前端会从 您的 API 获取真正的身份验证令牌
如果这条链全部成功,您可以非常确定您的内部网络中的一切都很好。这对于公司内部来说是一个足够好的方法。
对于外部使用,您可以在第 1 步和第 2 步中提供一个安全密钥,sso 必须为从前端生成的前端提供回来,以确保此重定向来自您的 SSO。
编辑:有关加密的更多详细信息:
您的 SSO 可能使用 HS512 对代码进行加密,该代码将发送到客户端,然后再通过 API 再次发送到 SSO。在这个循环中,如果 SSO 可以解密和验证它并且 API 是已知/允许的通信伙伴,那么您可以说所有方面都是可信的。
【讨论】:
【参考方案2】:隐式流的问题是 JWT 令牌存在于 URL 中。隐式流程可以在您的前端或后端实现,不推荐两者,但在前端执行有更多漏洞,如果我正确理解您的问题,这就是您正在尝试做的事情。
我会通过以下方式实现它。
-
您的前端将重定向到 WebSec 登录
成功登录后,WebSec 将重定向到您的后端
后端检索 JWT 令牌
后端创建一个一次性令牌并使用该一次性令牌重定向到您的前端
前端获取一次性令牌,POST将令牌发送到后端以获取 JWT 令牌
【讨论】:
这是让 API 重定向到前端的一种非常糟糕的方式。我永远不会推荐这种方法。 @JohnnyDevNull 想知道这种方法的坏处以及更好的方法是什么,您能说明一下吗? 我不推荐隐式流,在我的回答中明确提到,但是如果您看到问题中的第 2 点,似乎他的 SSO 不支持显式流。所以我的回答是,如果他的 SSO 不支持显式流,他可以如何更好地实现它。如果他的 SSO 支持显式流,我肯定会推荐它,并且用户自己似乎根据他共享的链接知道它。 确实如此,但仅用于内部使用,隐式流程也应该足够好。当有人试图从内部入侵时,还会出现其他安全问题。以上是关于具有服务网关调用的 SSO 身份验证 Angular 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Security 上具有不记名身份验证的 CORS