如何从我的MVC站点访问自己的API?

时间:2012-03-14 02:59:14

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

这是我的设置:

我有一个使用www子域(例如,www.example.com)托管的MVC3站点。我的网站通过SSL和表单身份验证进行保护,由ASP.NET成员资格/角色提供程序支持。我有HTTP处理程序,在/ services下提供服务功能(例如,www.example.com / services)。这些通过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. 更改我的身份验证策略。
  4. 我觉得我可能不应该使用自己的公共API,并且可以使用我自己的私有服务更好地服务(这很好,因为逻辑都通过外观层共享)。

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

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

    谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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