静态 Angular 应用调用 Azure Functions。这是一个安全问题吗?
Static Angular App calling Azure Functions. Is it a security issue?
我有一个 node.js
应用 authentication/authorization。我有一个 Azure 函数,它接受身份验证令牌(验证并)执行背后的业务逻辑(通过 CORS 公开)。我有一个带有 Angular 应用程序的静态网站,该应用程序重定向到 node.js
进行身份验证,获取令牌并(直接)调用 Azure 函数。对于来自 angular 的所有后续请求,我们使用相同的令牌。
我的恐惧:如果任何网络嗅探工具获得令牌,我们的业务可能会受到攻击,因为相应的工具将拥有代表用户执行 Azure 功能的一切。我使用 cURL 进行了相同的测试,并且能够直接执行 Azure 函数(使用从开发工具捕获的令牌)。
问题:
- 以上架构是否存在缺陷
- 如果是这样,最好的方法是什么
- 如果不是,我的担心是否成立?
- 将 Azure 函数直接公开给 public 是个好主意(即使它只接受授权请求)。
谢谢
Are there any flaws in above architecture
当然有
If so, what's the best approach
有很多
If not, is my fear valid?
有点,但如果你没有搞砸认证部分你应该没问题;)
Is it a good idea to expose Azure functions directly to public (even though it accepts only authorized requests).
当然是。在执行任何业务逻辑之前只需进行身份验证。您已完成身份验证(希望是正确的),您很可能在 HTTPS 请求的 header 中传递了令牌(我假设 header 中的 Bearer
JWT 令牌),所以它是与有效载荷一起加密(这只会使嗅探变得非常困难)。我还假设您将它保存在安全 cookie 等访问受限的地方。
你没有提到的一件事是让令牌失效(例如当用户注销时)和合理的到期时间(其中取决于你的用例)。也许添加 drop-all-sessions 按钮。有很多策略可以强化您的 API,但从未真正让您达到目标。
作为旁注
根据经验,如果 AAD B2C 是一个选项,我会选择它来管理最终用户。与 Azure Functions 很好地集成,为您提供 oauth 流程可以与第 3 方集成 + 相当多的库将其与您的堆栈集成(历史质量各不相同),您可以强制执行 MFA,它为您提供 MS 质量的马铃薯邮票。 IIRC 的主要缺点是 EasyAuth of 在您的本地开发环境中不起作用,因此您必须以某种方式模拟它。
对于 Azure 函数,使用基于 JWT 令牌的授权很容易实现。下面的讨论很好地解释了这一点。
Using JSON Web Tokens (JWT) with Azure Functions (WITHOUT using Active Directory)
我们有类似的实现,但有一些变化。
我有一个 node.js
应用 authentication/authorization。我有一个 Azure 函数,它接受身份验证令牌(验证并)执行背后的业务逻辑(通过 CORS 公开)。我有一个带有 Angular 应用程序的静态网站,该应用程序重定向到 node.js
进行身份验证,获取令牌并(直接)调用 Azure 函数。对于来自 angular 的所有后续请求,我们使用相同的令牌。
我的恐惧:如果任何网络嗅探工具获得令牌,我们的业务可能会受到攻击,因为相应的工具将拥有代表用户执行 Azure 功能的一切。我使用 cURL 进行了相同的测试,并且能够直接执行 Azure 函数(使用从开发工具捕获的令牌)。
问题:
- 以上架构是否存在缺陷
- 如果是这样,最好的方法是什么
- 如果不是,我的担心是否成立?
- 将 Azure 函数直接公开给 public 是个好主意(即使它只接受授权请求)。
谢谢
Are there any flaws in above architecture
当然有
If so, what's the best approach
有很多
If not, is my fear valid?
有点,但如果你没有搞砸认证部分你应该没问题;)
Is it a good idea to expose Azure functions directly to public (even though it accepts only authorized requests).
当然是。在执行任何业务逻辑之前只需进行身份验证。您已完成身份验证(希望是正确的),您很可能在 HTTPS 请求的 header 中传递了令牌(我假设 header 中的 Bearer
JWT 令牌),所以它是与有效载荷一起加密(这只会使嗅探变得非常困难)。我还假设您将它保存在安全 cookie 等访问受限的地方。
你没有提到的一件事是让令牌失效(例如当用户注销时)和合理的到期时间(其中取决于你的用例)。也许添加 drop-all-sessions 按钮。有很多策略可以强化您的 API,但从未真正让您达到目标。
作为旁注
根据经验,如果 AAD B2C 是一个选项,我会选择它来管理最终用户。与 Azure Functions 很好地集成,为您提供 oauth 流程可以与第 3 方集成 + 相当多的库将其与您的堆栈集成(历史质量各不相同),您可以强制执行 MFA,它为您提供 MS 质量的马铃薯邮票。 IIRC 的主要缺点是 EasyAuth of 在您的本地开发环境中不起作用,因此您必须以某种方式模拟它。
对于 Azure 函数,使用基于 JWT 令牌的授权很容易实现。下面的讨论很好地解释了这一点。 Using JSON Web Tokens (JWT) with Azure Functions (WITHOUT using Active Directory) 我们有类似的实现,但有一些变化。