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

Azure 最佳实践:从单页应用程序(SPA)调用单独的Web API服务,azure,controller,cors,single-page-application,Azure,Controller,Cors,Single Page Application,为什么 我们正在围绕以下场景的体系结构进行讨论: 单页应用程序(使用ASP.NET WebAPI的JavaScript驱动的Html5应用程序) 具有BusinessLogic、DAL和数据库连接的独立REST服务(仅限WebAPI) Azure AD(ADAL)上的安全性 从单页应用程序调用REST服务的方法是什么 目前,我们正在考虑各种可能性: 1) 通过CORS直接从客户端(浏览器)调用REST服务: 客户端(浏览器)->REST服务 …如本例所示: 2) 从单页应用程序调用WebAP

为什么

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

  • 单页应用程序(使用ASP.NET WebAPI的JavaScript驱动的Html5应用程序)
  • 具有BusinessLogic、DAL和数据库连接的独立REST服务(仅限WebAPI)
  • Azure AD(ADAL)上的安全性
从单页应用程序调用REST服务的方法是什么

目前,我们正在考虑各种可能性:

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

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

…如本例所示:

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

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

对于第一个变体,我们看到一些安全问题。 这样做一般省钱吗? 如果REST服务位于内部网络中,而SPA位于非军事区,该怎么办

对于第二种变体,这里的最佳实践是什么?因为我们需要这样的控制器:

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;
}
//GET/api/Models
公共IQueryable Get()
{
//创建一个HttpClient实例
var resp=client.GetAsync(“http://localhost:9472/api/Models三、结果;
var result=resp.Content.ReadAsAsync().result.AsQueryable();
返回结果;
}
REST服务(本地主机:9472)控制器示例:

//GET /api/Models
public IQueryable<Model> Get(){
   return _repository.GetAllModels();
}
//GET/api/Models
公共IQueryable Get(){
返回_repository.GetAllModels();
}
->这样做对吗

谢谢你的帮助

亲切问候,,
Peter

我刚刚完成了一个大型企业风格的水疗中心,几乎完全使用了您在选项1中描述的体系结构

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

你能解释一下你对选项1的安全顾虑吗?希望我能帮你减轻这些顾虑

--编辑--


我明白你关于水疗的观点是在非军事区内,而RESTful服务是内部的,为了让你的水疗中心能够调用RESTful服务,你需要一种方式将其暴露给外部世界。根据您已有的安全措施,可能只是将其移动到DMZ中,否则您需要在外部世界和内部rest服务之间进行代理。

谢谢您的回答。我们决定使用第一个场景,因为我们有DMZ,所以我们需要中间的代理。我已经发布了一个关于身份验证的后续问题->