最佳实践:从单页应用程序 (SPA) 调用单独的 Web-API 服务
Best Practice: Calling separate Web-API Service from Single Page Application (SPA)
全部
我们正在围绕以下场景的架构进行讨论:
- 单页应用程序(JavaScript 驱动 Html5 使用 ASP.NET WebAPI 的应用程序)
- 将 REST 服务(仅限 WebAPI)与 BusinessLogic、DAL、数据库连接分开
- Azure AD (ADAL) 的安全性
从单页应用程序调用 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 中,否则您将需要在外部世界和内部休息服务之间进行代理。
全部
我们正在围绕以下场景的架构进行讨论:
- 单页应用程序(JavaScript 驱动 Html5 使用 ASP.NET WebAPI 的应用程序)
- 将 REST 服务(仅限 WebAPI)与 BusinessLogic、DAL、数据库连接分开
- Azure AD (ADAL) 的安全性
从单页应用程序调用 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 中,否则您将需要在外部世界和内部休息服务之间进行代理。