最佳实践:从单页应用程序 (SPA) 调用单独的 Web-API 服务

Best Practice: Calling separate Web-API Service from Single Page Application (SPA)

全部

我们正在围绕以下场景的架构进行讨论:

从单页应用程序调用 REST 服务的方式是什么?

目前我们正在寻找可能性:

1) 通过 CORS 直接从客户端(浏览器)调用 REST 服务:

客户端(浏览器)-> REST 服务

...就像这个例子:https://github.com/AzureADSamples/SinglePageApp-WebAPI-AngularJS-DotNet

2) 从单页应用程序调用 WebAPI 服务,然后调用 REST 服务:

客户端(浏览器)-> WebAPI SPA -> REST-服务

对于第一个变体,我们看到了一些安全问题。 这样做一般省事吗? 如果 REST-Service 在内部网络中而 SPA 在 DMZ 中怎么办?

对于第二种变体,此处的最佳做法是什么?因为我们的控制器需要这样的东西:

SPA 控制器示例:

//GET /api/Models
public IQueryable<Model> Get()
{
   // Create an HttpClient instance
   var resp = client.GetAsync("http://localhost:9472/api/Models").Result;
            var result = resp.Content.ReadAsAsync<IList<Model>>().Result.AsQueryable();
   return result;
}

REST 服务 (localhost:9472) 控制器示例:

//GET /api/Models
public IQueryable<Model> Get(){
   return _repository.GetAllModels();
}

-> 这是正确的做法吗?

感谢您的帮助!

亲切的问候, 彼得

我刚刚使用几乎与您在选项 1 中描述的体系结构完成了一个大型企业风格的 SPA。

总的来说,让事情变得简单。更多的故障点只会增加维护、正常运行时间、可扩展性等方面的风险。如果您 不需要 代理服务,请不要为了它而引入它 - 您的服务安全性不会降低。

您能否解释一下您对选项 1 的安全担忧,希望我能为您解决这些问题?

-- 编辑--

我明白你关于 SPA 在 DMZ 内并且 RESTful 服务在内部的观点,为了让你的 SPA 能够调用 RESTful 服务,你需要一种方法来公开它外面的世界。根据您已有的安全措施,可能只是将其移至 DMZ 中,否则您将需要在外部世界和内部休息服务之间进行代理。