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



Hy所有

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

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

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

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

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

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

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

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

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

对于第一种变体,我们看到了一些安全问题。这样做通常是省钱吗?如果REST服务在内部网络中,而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();
}

->这样做对吗?

谢谢你的帮助!

谨致问候,Peter

我刚刚完成了一个大型企业风格的SPA,几乎完全使用了选项1中描述的架构。

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

你能解释一下你对选项1的安全担忧吗?希望我能为你减轻这些担忧?

--编辑--

我认为你对SPA的看法是在DMZ内,而RESTful服务是内部的,为了让你的SPA能够调用RESTful服务,你需要一种向外界公开的方式。根据您已经具备的安全性,可以将其转移到DMZ,否则您将需要在外部世界和内部休息服务之间进行代理。

最新更新