大家好
我们正在围绕以下场景的架构进行讨论:
- 单页应用程序(使用 ASP.NET WebAPI 的 JavaScript 驱动的 Html5 应用程序)
- 将 REST 服务(仅限 WebAPI)与 BusinessLogic、DAL、DataBase-Connectivity 分开
- Azure AD (ADAL) 的安全性
从单页应用程序调用 REST 服务的方式是什么?
目前我们正在寻找可能性:
1) 通过 CORS 直接从客户端(浏览器)调用 REST-Service:
客户端(浏览器)-> REST-服务
...就像这个例子:https://github.com/AzureADSamples/SinglePageApp-WebAPI-AngularJS-DotNet
2) 从单页应用程序调用 WebAPI 服务,然后调用 REST 服务:
客户端(浏览器)-> WebAPI SPA -> REST-服务
对于第一个变体,我们看到一些安全问题。 一般这样做是不是就省事了? 如果 REST 服务位于内部网络而 SPA 位于 DMZ 中怎么办?
对于第二种变体,这里的最佳实践是什么?因为我们的 Controller 需要这样的东西:
SPA Controller 示例:
//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-Service (localhost:9472) Controller 示例:
//GET /api/Models
public IQueryable<Model> Get(){
return _repository.GetAllModels();
}
-> 这是正确的方法吗?
感谢您的帮助!
亲切的问候, 彼得
最佳答案
我刚刚完成了一个大型企业风格的 SPA,几乎完全使用了您在选项 1 中描述的架构。
一般来说,让事情变得简单。更多的故障点只会增加维护、正常运行时间、可扩展性等方面的风险。如果您需要代理服务,请不要为了代理服务而引入它 - 您的服务将无法实现安全性较低。
您能解释一下您对选项 1 的安全担忧吗?希望我能为您减轻这些担忧?
-- 编辑--
我明白您关于 SPA 位于 DMZ 内且 RESTful 服务位于内部的观点,为了让您的 SPA 能够调用 RESTful 服务,您将需要一种将其公开给外界的方法。根据您已有的安全措施,可能只是将其移至 DMZ,否则您将需要在外部世界和内部休息服务之间进行代理。
关于azure - 最佳实践 : Calling separate Web-API Service from Single Page Application (SPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29392954/