我有一个 MVC 3 REST API,它有一个简单的 Controller :ApiController
。 ApiController
中有一个方法 Foo
,它接收一些字符串信息并返回一个 JSON 结果:
public class ApiController : Controller
{
[HttpPost]
public JsonResult Foo(string input)
{
...
}
}
我想用一些用户输入的数据调用 Foo 的 JQuery 方法并显示结果。
这里的问题是我想检查是否允许用户访问 Foo。在 ASP.NET MVC 3 中解决这个问题的最佳方法是什么?我认为答案是使用 SSL 和基本身份验证,但我不知道那会是什么样子。另外,我是否必须滚动我自己的密码散列/加盐,或者有什么方法可以只使用表单例份验证?
编辑:请注意,我正在尝试创建第三方开发人员可以使用的 API。例如,如果有人编写了一个 Rapportive 风格的浏览器插件来扫描您的 Gmail,将文本发送到 Foo,并在浏览器中显示。
此外,我相信仅使用 Forms Authentication 就会以纯文本形式发送用户名/密码信息,对吗?我不确定如何实现 SSL 来防止这种情况。
最佳答案
您可以使用 FormsAuthentication 和 [Authorize]
属性。因此,您可能有一个带有 LogOn 操作的 AccountController
,它只能通过 HTTPS 访问。该 Controller 将允许客户端进行身份验证并获取身份验证 cookie,该 cookie 将被重用于访问 API:
public class AccountController: Controller
{
[HttpPost]
[RequireHttps]
public ActionResult LogOn(string username, string password)
{
// TODO: verify the credentials and emit an authentication cookie if valid
// return some result (JSON?) to indicate whether the operation succeeded or
// not
}
}
然后剩下的就是用 [Authorize]
属性装饰您想要保护的其他 Controller 操作:
public class ApiController : Controller
{
[HttpPost]
[Authorize]
public JsonResult Foo(string input)
{
...
}
}
因此,现在客户端需要首先调用 LogOn 操作并在响应中获取相应的身份验证 cookie,这些 cookie 将随后续调用您的 API 一起发送。
关于使用表单例份验证在 ASP.NET MVC 3 中对 JSON 的 Javascript 请求结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5601484/