【问题标题】:How do I access my own API from my MVC site?如何从我的 MVC 站点访问我自己的 API?
【发布时间】:2012-03-30 12:28:39
【问题描述】:

这是我的设置:

我有一个使用 www 子域(例如 www.example.com)托管的 MVC3 站点。我的网站通过 SSL 和表单身份验证得到保护,由 ASP.NET 成员/角色提供程序提供支持。我在 /services(例如 www.example.com/services)下有提供服务功能的 HTTP 处理程序。这些通过 SSL 上的基本身份验证得到保护。我有移动设备成功访问/使用这些服务。我还创建了一个带有 api 子域(例如 api.example.com)的新站点,这将是我面向公众的 API。这些服务目前通过 WCF Web API 预览版 6 公开(最终将迁移到 ASP.NET Web API)。这些服务也通过基于 SSL 的基本身份验证得到保护。我的 ASP.NET 成员实现存储散列密码(即,它们未加密)。所有服务都提供 JSON 响应。所有这些东西都很好用。

这是我的困境:

我开始在 MVC 站点上编写一个新视图,并意识到使用 Ajax 会很棒。我的具体案例是实现级联下拉列表。我想使用 jQuery 和 api 子域下的新服务来实现这一点。起初我认为这将是一个简单的练习,然后我意识到,我没有有效的方法来调用我自己的 API。我的客户(移动设备)都在本地存储他们的用户名/密码,所以这很容易。但是,如果同一用户登录到我的站点,我有他们的用户名但没有他们的密码,因此我无法直接访问 api 子域下提供的任何服务。

在我看来,我有三个解决方案:

  1. 直接在 /services URI 下实现支持 MVC 站点的服务,避免使用我自己的公共 API。
  2. 在我的会员商店(我知道用户名/密码)中创建一个超级用户,该网站用于访问 api 子域中的服务。
  3. 更改我的身份验证策略。

我突然想到,我可能不应该使用我自己的公共 API,而使用我自己的私有服务会更好(这没关系,因为逻辑都是通过外观层共享的)。

这里推荐的策略是什么?我还假设如果我要使用选项 2 或 3,我将不得不使用 JSONP。这是正确的吗?

任何建议将不胜感激。如果需要更多详细信息,请发布,我会更新答案。

谢谢!

【问题讨论】:

  • tl;dr 但我猜您需要从 blah/api 托管您的 api,并从 api.blah 重写它们的 URL。这应该允许您通过 javascript 解决任何跨域问题。
  • API 应该使用与站点其他部分相同的身份验证策略。授权令牌以 cookie 的形式编写,应通过 AJAX 发送(假设它们是为支持子域而编写的,或者您将 API 托管为虚拟目录)。

标签: c# asp.net-mvc-3 authentication wcf-web-api asp.net-web-api


【解决方案1】:

如果我正确地遵循了这一点,您只需要确保您的 Forms Auth cookie 没有子域,因此它将是:.example.com,如果您使用单独的服务器,则在它们之间共享您的机器密钥。

由于表单身份验证令牌是无状态的,并且在服务器端没有保留任何内容,因此应该可以正常工作。

【讨论】:

    【解决方案2】:

    为了简单起见,并且因为我认为使用自己的公共 API 不符合我的最佳利益,我在现有 MVC 站点中的新控制器上实现了 JsonResult 操作。这让我可以利用现有的表单身份验证并避免跨域 ajax 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      相关资源
      最近更新 更多