如何安全地将 EC2 托管的 Shiny 应用程序集成到 asp.net 项目中

How to securely integrate EC2 hosted Shiny app into asp.net project

我有两个应用程序。

  1. EC2 上托管的 R Shiny 应用程序
  2. Asp.net 托管在 Azure 上的应用程序。

asp.net 应用程序执行用户身份验证,用于组织整个数据科学管道。用户提供数据,数据科学家转换数据并交付闪亮的应用程序。最后,用户在 asp.net 应用程序中打开 Shiny 应用程序。

我遇到的问题是我不知道如何在 asp.net 应用程序中安全地集成我开发的 Shiny 应用程序。

我可以这样解决问题:

基本上,我可以制作一个带有 link 的简单 iframe 到 EC2 实例的 public 域。但是,这并不安全。任何人都可以通过简单的页面源点击找到并访问 url。

我考虑过的另一个选项是限制 EC2 安全组中的 IP 地址。但是,问题是 asp.net 应用程序应该由不同的 entities/independent 用户使用。因此,安全性需要更细化 [用户是否有权访问应用程序、应用程序中的项目、项目中的容器?] 而不仅仅是服务器 IP 地址。

此外,我曾考虑在实际的 Shiny 应用程序中提供第二级身份验证,但这实际上失去了 asp.net 身份验证的首要意义。

关于我应该继续研究的方向有什么想法或提示吗?

我认为你是对的,有两种选择。第一种是在两台服务器之间创建安全连接并使用 .Net 应用程序代理流量,但这并没有达到目的。

第二个是对两台服务器的使用进行身份验证。您可以通过让 .Net 服务器以某种方式将有关活动会话的数据传递给 Shiny 应用程序以同步它们来做到这一点,但这并不理想。

您可以改为使用身份验证机制,例如 JWT,其中 .Net 服务器会在客户端登录时向客户端发出令牌(即 cookie 或嵌入到 iFrame URL),然后客户端然后将此传递给令牌到闪亮的服务器,它只需要验证令牌。如果使用 cookie,您需要确保两个服务器都在同一个子域中,以便正确设置令牌。

免责声明:

我的和@OllyTheNinja 解释的有点相似。由于我不熟悉 JWT,我无法比较这两种方法,但很想听听更多可能的集成方法。

我可以想到另一种方法,这是在 ASP.Net 中为登录页面的用户生成一个随机数(大约 20 个字符),并在共享介质(例如数据库)中记录时间和令牌).然后当用户点击将他们带到 shiny URL 的按钮时,将该令牌附加到 URL 并将其传递给 Shiny 服务器,然后解析 URL 并找到令牌并在数据库中搜索它(您可以定义一个到期日期,因为您正在重新编码生成时间)。如果存在,加载页面,否则重定向到另一个页面。

对于解析这可能有帮助: https://shiny.rstudio.com/reference/shiny/1.6.0/parseQueryString.html

为了将令牌附加到URL,我想你可以使用Ajax,我已经很久没有写任何.Net代码了,但我相信有办法,也许是这样的: How can I use $.ajax to set image src to dynamic image/png data?

我想最好在 Shiny 上记录客户端属性(例如 IP)并设置一个逻辑,即如果请求来自相同的 IP、浏览器,那么直到几个小时后才检查令牌的有效性小时。通过这种方式,您也可以构建自己的防火墙。

由于令牌足够长(即~20个字符),有20^(~72个,即26个小写字母+26个大写字母+~10个特殊字符+9位数字)可能的排列,几乎无法破解,特别是如果您将每个令牌的到期日期定义为大约 1-2 小时。