【问题标题】:Javascript request for JSON result in ASP.NET MVC 3 using Forms Authentication对 JSON 的 Javascript 请求导致使用表单身份验证的 ASP.NET MVC 3
【发布时间】:2011-08-01 20:52:56
【问题描述】:

我有一个 MVC 3 REST API,它有一个简单的控制器: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,然后在浏览器中显示。

另外,我相信仅使用表单身份验证会以纯文本形式发送用户名/密码信息,对吧?我不确定如何实施 SSL 来防止这种情况。

【问题讨论】:

    标签: javascript json rest asp.net-mvc-3 restful-authentication


    【解决方案1】:

    您可以使用 FormsAuthentication 和 [Authorize] 属性。因此,您可能有一个带有登录操作的AccountController,该操作只能通过 HTTPS 访问。此控制器将允许客户端进行身份验证并获取身份验证 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] 属性保护的其他控制器操作:

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

    所以现在客户端需要首先调用 LogOn 操作并在响应中获取相应的身份验证 cookie,该 cookie 将随后续调用您的 API 一起发送。

    【讨论】:

    • 谢谢 Darin,我不知道 RequireHttps。我仍然有一个问题,即如何允许第 3 方开发人员使用我的 API 进行构建。我想要一个无状态 API,他们基本上每次拨打电话时都会提交用户名/密码。例如,如果某个 Rails 开发人员想要构建一个调用 Foo 的 Web 应用程序,这应该不是问题,他们只需使用其开发人员帐户的适当用户名/密码调用 URL。我想这类似于 Facebook 使用开发者密钥的方式。
    • @Wesley Tansey,在这种情况下,您可以编写一个自定义的Authorize 属性,您可以在其中验证客户端传递的某些令牌的有效性。它可以是自定义 HTTP 标头或其他内容。可以是用户名/密码,或者您可以向客户端发送一些私钥,他们需要这些私钥随每个请求一起发送,您将在覆盖的 AuthorizeCore 方法中解密并验证其有效性。
    • 谢谢。我就是这么想的。似乎这样一个常见的任务在 .NET 中应该更直接。现在几乎每个构建网络应用程序的人都不需要开发人员 API 吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 我知道 Authorize 属性。我不知道这是否对我有用。我想创建一个第三方应用程序可以使用的开发人员 API,最好是无状态 API。例如,想象一个 Rapportive 风格的浏览器插件,它读取您在 Gmail 中的电子邮件并使用 Foo 处理它们,然后在浏览器中显示结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多