21

我有一个使用 ASP.NET MVC3 开发的网站。
我现在想公开一个 REST API 供其他人使用,它将公开与网站相同的功能。

在网站中,一旦用户登录并针对数据库验证了凭据,会话就会管理用户的登录状态。
我将如何使用 REST API 进行等效操作,其中公开的许多方法都需要用户登录(或至少具有有效的用户名和密码)?

除此之外,网站的最佳方法是否也是使用 REST API(假设 API 涵盖了网站所需的所有功能)?

ASP.NET MVC3 对此的适用程度如何——当然要考虑到该站点已经使用此框架存在?

4

5 回答 5

9

几年前,我写了一篇关于如何 [在 ASP.NET MVC 3 应用程序中构建 RESTful API 架构]的博客文章,最终不得不放弃该网站。:(如果您想将 REST API 构建到您的 MVC 应用程序中,这可能是一个好的开始。

请参阅@tugberk 关于使用 WebAPI 的回答以获得良好的解决方案。

于 2011-11-02T20:01:12.730 回答
6

ASP.NET MVC 非常适合这种情况。尽管您可以使用其他方法(如 WCF),但我会坚持使用 MVC,因为您已经有一个需要向其他消费者公开的工作站点。

另见我的另一个答案:

哪个更适合为我的网站构建 API:MVC 或 Ado.net 数据服务?

于 2011-09-28T16:03:43.750 回答
4

笔记:

WCF Web API 现在是 ASP.NET Web API 并且发生了很大变化。测试版现已推出。有关详细信息:ASP.NET Web API 入门 - 教程、视频、示例

我会使用 WCF Web Api 来做到这一点。ASP.NET MVC 也很不错并且能够公开您的数据,但是如果您考虑将数据公开给您的用户,WCF Web Api 会更有能力。它易于使用并将 REST Web API 集成到您的系统中。

对于身份验证,API Key 始终是此类场景的最佳方式。这是一个很好的例子,说明如何使用 WCF Web API 实现 API Auth:

http://weblogs.asp.net/cibrax/archive/2011/04/15/http-message-channels-in-wcf-web-apis-preview-4.aspx

笔记:

他们几周前刚刚发布了预览版,据我所知,消息通道已更改为消息处理程序。但是上面的文章应该给你一个想法。

对于安全实施,以下内容也可能有所帮助:

wcf 身份验证令牌实现 - 怎么做

于 2011-09-28T14:55:19.653 回答
1

ASP .NET MVC 是一个很好的选择。我创建了几个充当 RESTful 服务和网站的 ASP MVC。

总结一下我使用的设计范例,每个控制器都有一个动作,它发出请求数据的 JSON 表示。所述数据加载到服务器上的视图模型中,内置 JSON 序列化程序负责服务器端,而 jQuery 视图很好地将数据加载回我的实际网页以供使用。

站点本身在每个控制器上都有索引操作,它们发出必要的标记,但没有数据。页面上的 jQuery document.ready 方法从本质上是我的 rest api 中加载数据,但直接构建到站点中。

查看 Nerd Dinner 以获得出色的示例代码。 http://nerddinner.com/

关于安全性,我认为我的经验与您的不同。如果您的用户都在同一个域中并拥有 AD 凭据,那么 ASP MVC 与 Active Directory 的集成非常好。这是我使用过的唯一方法,并且轻松、成功和满意。

我让同事与其他在调用授权方法时分发令牌的 API 进行交互。收到的令牌将由客户负责存储并返回每个请求,但我无法与您讨论实现细节,因为我没有这方面的个人经验。

于 2011-11-02T19:55:55.787 回答
1

我将使用基于 WCF Web 服务的实现,如下所示。

  • 例如,将所有业务逻辑包装到一个名为 yourproject.businessservices 的单独 dll 项目中
  • 创建一个身份验证 Web 服务,该服务将为每个用户登录生成一个不可重复的令牌
  • 此登录将用户的基本详细信息与令牌一起存储在像 MemCache 这样的缓存中,该缓存应该具有滑动到期
  • 如果用户在一个小时内没有访问缓存,则缓存过期并且用户被注销
  • 如果用户正在使用它,则缓存会不断扩展。

    在 wcf 服务方面,

  • 创建 API 以在身份验证时返回令牌

  • 所有 wcf 方法都将具有需要验证的会话 ID

    优点是 wcf 方法可以公开返回 xml 或 json 格式,也可以用作普通的 Web 服务。

    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/MyModule/XML/GetData/{customerSessionId}")] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat。 Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "/MyModule/JSON/GetData/{customerSessionId}")]

于 2011-11-03T03:13:38.020 回答