【发布时间】:2020-07-20 20:08:44
【问题描述】:
我遇到了一个问题,简单来说,就是找到一种方法来安全地呈现和提供 HTML 文件(以及 CSS、JS)从服务器中的本地磁盘到运行在客户端浏览器。
应用程序
- 前端 Web 应用程序是使用 React JS(确切地说是 react-admin)创建的。
- 使用 Net core 3.1 设置处理 Rest API 请求的后端
- 这两个应用程序都托管在 Windows 服务器中的 IIS 中(作为 IIS 中默认网站内的应用程序服务)。
约束
- 应用程序的托管只能在 Windows 服务器的 IIS 内部进行。 (也欢迎其他选项)
- 后端/前端可以使用任何我们想要的语言。 (最好是 dot net core,因为我在过去 10 年里一直在使用 c#)
技术细节
我正在开发一个托管点云查看器的解决方案(Potree,一个使用三个 js 开发的开源项目)。这是一个独立的过程。 Potree 提供了一个基于桌面的 C++ 转换器,它将输入转换为网页(带有 html、css、js)(让我们将其称为目标文件)。我们可以在任何服务器上托管此网页,以供外部各方查看。
当前状态
工作:目标文件作为应用程序托管在 IIS 服务器中,可以毫无问题地访问它。 (图片可以在下面看到)。
正在运行: react js web 应用程序已构建,dist 文件托管在 IIS 服务器中,也可以毫无问题地访问它。
以上两个步骤确认两个构建的应用程序运行良好,因为它们可以单独托管,也可以从其他计算机访问。
我坚持的功能
- 目标文件适用于不同的用户。因此,这必须在通过 API 请求进行验证后提供。
- 当前设置是这样的,当用户单击 react 应用程序中的链接时,它会进行 REST Api 调用,该调用由后端 dotnet 核心应用程序处理(可能有其他更好的方法将 html 文件提供给前端网络应用程序)。
-
我尝试了几种方法来提供 HTML 文件。 选项 1:使用 StaticFiles(在启动时)。我正在尝试从本地读取 html 文件,然后使用
在 noidea.cshtml 文件中呈现它@Html.Raw(Model.SomePropertyName)// GET: /<controller>/ public IActionResult noidea() { try { var newmodel = new noideaModel(); var file = System.IO.File.ReadAllLines("./acl-i/acl-i.html"); newmodel._html = string.Join("", file); return View(newmodel); //return View(); } catch (Exception) { throw; } }}
此选项部分工作正常,但问题是由于我已将文件放在静态文件夹中(在启动时配置),用户可以轻松更改 URL 并访问那里存在的其他文件。
所以,我尝试使用选项 2,即从本地磁盘读取 html 文件的内容并将其作为内容结果提供。:
[AllowAnonymous]
[HttpGet, Route("viewer")]
public IActionResult getViewer()
{
//For serving single static html file.
var file = System.IO.File.ReadAllLines("./acl-i/acl-i.html");
var item = string.Join("", file);
return new ContentResult
{
ContentType = "text/html",
StatusCode = (int)StatusCodes.Status200OK,
Content = item
};
}
这里的成功点是,我能够正确地进行身份验证,并且用户无法更改 URL,因为 api 端点为文件提供服务。 问题是我只提供 HTMl 和链接的 css,客户端浏览器无法识别 js。下图显示了问题。 js和css也在同一个api端点搜索。
问题:
我是 react js 和 web 前端开发的新手。我主要使用 Xamarin、C#/WPF/XML 用于桌面应用程序,并为 CRUD 应用程序开发 Web API 端点。所以,我完全被困在这里。不知道如何解决这个问题。
- 我正在寻找解决当前问题的方法。
- 或者找到一种优雅简单的方法来解决问题(我还看到了一些使用 react js 的 express js 示例,但不清楚,我也是新手)。
我只需要找到一种方法来验证用户,然后为他提供一个完全呈现的 html 页面以在他的浏览器中查看(这样解释听起来很容易) 任何帮助或方向/建议表示赞赏。
【问题讨论】:
-
the problem is that since I have put the files inside a static folder (configured in startup) users can easily change the URL and access other files present there您说用户可以轻松访问存储在该文件夹中的其他文件,用户如何知道您的Web服务器上的这些文件信息,例如文件名,文件扩展名等? -
因为转换后的页面(由 Potree 转换器生成)具有项目文件名。任何有权访问该项目的用户都可以轻松猜出里面的模型名称。假设我们有一个模型“BuildingABC”,那么转换后的 html 页面将是“BuildingABC.html”,对于每个建筑物,我们遵循一组ISO 标准名称。因此,在建筑物上工作的人很容易猜到。
标签: html reactjs asp.net-core asp.net-web-api react-admin