2011-04-08 49 views
1

我有一个MVC 3 REST API,它有一个简单的控制器:ApiController。有一个在ApiController方法Foo,需要一些字符串信息,并返回JSON结果:Javascript请求JSON导致ASP.NET MVC 3使用Forms Authentication

public class ApiController : Controller 
{ 
    [HttpPost] 
    public JsonResult Foo(string input) 
    { 
     ... 
    } 
} 

我想有一些用户输入的数据jQuery的方法调用Foo和显示结果。

这里的问题是我想检查用户是否被允许访问Foo。在ASP.NET MVC 3中,最好的方法是什么?我认为答案是使用SSL和基本身份验证,但我不知道会是什么样子。另外,我是否必须推出我自己的密码哈希/盐渍或有一些方法来使用表单身份验证?

编辑:请注意,我正在尝试创建第三方开发人员可以使用的API。例如,如果有人编写了用于扫描Gmail的Replive风格浏览器插件,则将文本发送到Foo,并将其显示在浏览器中。

另外,我相信只是使用Forms Authentication将以纯文本发送用户名/密码信息,对吧?我不知道如何实施SSL来防止这种情况。

回答

2

您可以使用FormsAuthentication和[Authorize]属性。所以你可能有一个AccountController LogOn行动,只能通过HTTPS访问。该控制器将允许客户端进行身份验证并获得其将用于访问API可以重复使用的身份验证Cookie:

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]属性,以确保您的其他控制器操作:

public class ApiController : Controller 
{ 
    [HttpPost] 
    [Authorize] 
    public JsonResult Foo(string input) 
    { 
     ... 
    } 
} 

因此,现在客户端需要先调用LogOn操作并在响应中获取相应的身份验证Cookie,随后将对您的API进行调用。

+0

感谢Darin,我不知道RequireHttps。我仍然有一个问题:如何让第三方开发人员使用我的API进行构建。我想要一个无状态的API,他们每次打电话时基本上都会提交用户名/密码。例如,如果某些Rails开发人员想要构建一个调用Foo的Web应用程序,那么它不应该成为问题,他们只需使用适当的用户名/密码为其开发人员帐户调用该URL即可。类似于Facebook如何使用开发人员密钥,我想。 – 2011-04-09 19:55:27

+1

@Wesley Tansey,在这种情况下,您可以编写一个自定义'Authorize'属性,在其中验证客户端传递的某些令牌的有效性。它可能是一个自定义的HTTP头或其他东西。可能是用户名/密码,或者您可以向客户端发送一些私钥,这些私钥是他们发送每个请求所需的私钥,您可以在重写的'AuthorizeCore'方法中解密并验证其有效性。 – 2011-04-09 21:31:29

+0

谢谢。这就是我的想法。看起来像.NET这样的常见任务应该更直接。现在几乎每个构建Web应用程序的人都不需要开发人员API吗? – 2011-04-09 22:58:26

0

你应该可以使用[Authorize]属性来做你想要的。请参阅MSDN上的以下详细信息和示例:http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

您可以授权特定用户或特定角色中的用户。

创建新(非空)ASP.NET MVC项目时提供的默认基于表单的身份验证将使您能够授权用户。

+0

我知道授权属性。我不知道这是否会对我有用。我想创建一个第三方应用程序可以使用的开发者API,最好是无状态的API。例如,想象一下在Gmail中阅读您的电子邮件并使用Foo处理它们的报道式浏览器插件,然后将结果显示在浏览器中。 – 2011-04-08 23:15:10