Запрос Javascript для результата JSON в ASP.NET MVC 3 с использованием проверки подлинности с помощью форм

У меня есть REST API MVC 3 с простым контроллером: ApiController. Существует метод Foo в ApiController, который принимает некоторую строковую информацию и возвращает результат JSON:

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

Я хочу, чтобы метод JQuery вызывал Foo с некоторыми введенными пользователем данными и отображал результат.

Загвоздка здесь в том, что я хочу проверить, разрешен ли пользователю доступ к Foo. Как лучше всего это сделать в ASP.NET MVC 3? Я думаю, что ответ заключается в использовании SSL и базовой аутентификации, но я понятия не имею, как это будет выглядеть. Кроме того, нужно ли мне использовать собственное хеширование/соление пароля или есть способ просто использовать аутентификацию с помощью форм?

Изменить. Обратите внимание, что я пытаюсь создать API, который смогут использовать сторонние разработчики. Например, если кто-то пишет плагин для браузера в стиле Rapportive, который сканирует ваш Gmail, отправляет текст в Foo и отображает его в браузере.

Кроме того, я считаю, что простое использование проверки подлинности с помощью форм отправит информацию об имени пользователя и пароле в виде обычного текста, верно? Я не уверен, как реализовать SSL, чтобы предотвратить это.


person Wesley Tansey    schedule 08.04.2011    source источник


Ответы (2)


Вы можете использовать FormsAuthentication и атрибут [Authorize]. Таким образом, у вас может быть AccountController с действием LogOn, которое будет доступно только через HTTPS. Этот контроллер позволит клиентам проходить аутентификацию и получать файл 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 аутентификации в ответе, который будет отправлен при последующих вызовах вашего API.

person Darin Dimitrov    schedule 09.04.2011
comment
Спасибо Дарин, я не знал о RequireHttps. У меня все еще есть вопрос, как разрешить сторонним разработчикам строить с использованием моего API. Мне нужен API без сохранения состояния, в котором они в основном отправляют имя пользователя/пароль каждый раз, когда совершают вызов. Например, если какой-то разработчик рельсов хочет создать веб-приложение, которое вызывает Foo, это не должно быть проблемой, они просто вызывают URL-адрес с соответствующим именем пользователя/паролем для своей учетной записи разработчика. Похоже на то, как Facebook использует ключи разработчика, я полагаю. - person Wesley Tansey; 09.04.2011
comment
@Wesley Tansey, в этом случае вы можете написать собственный атрибут Authorize, в котором вы будете проверять действительность некоторого токена, переданного клиентом. Это может быть собственный HTTP-заголовок или что-то еще. Это может быть имя пользователя/пароль, или вы можете отправить клиентам некоторый закрытый ключ, который потребуется им для отправки вместе с каждым запросом и который вы расшифруете в переопределенном методе AuthorizeCore и проверите его действительность. - person Darin Dimitrov; 10.04.2011
comment
Спасибо. Вот о чем я думал. Похоже, такая общая задача должна быть более простой в .NET. Разве в наши дни почти всем, кто создает веб-приложения, не нужен API разработчика? - person Wesley Tansey; 10.04.2011

Вы должны иметь возможность использовать атрибут [Authorize], чтобы делать то, что вы хотите здесь. См. следующие сведения и пример в MSDN: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

Вы можете авторизовать определенных пользователей или пользователей в рамках определенной роли.

Проверка подлинности на основе форм по умолчанию, предоставляемая при создании нового (непустого) проекта ASP.NET MVC, позволит вам авторизовать пользователей.

person Ross Anderson    schedule 08.04.2011
comment
Я знаю об атрибуте Authorize. Хотя я не знаю, сработает ли это для меня. Я хочу создать API разработчика, который могут использовать сторонние приложения, предпочтительно API без сохранения состояния. Например, представьте себе подключаемый модуль браузера в стиле Rapportive, который читает ваши электронные письма в Gmail и обрабатывает их с помощью Foo, а затем отображает результат в браузере. - person Wesley Tansey; 09.04.2011