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,否则您将需要在外部世界和内部休息服务之间进行代理。