Microsoft MVC 4, APIController и правильный веб-сервис входа в RESTful - PullRequest
5 голосов
/ 28 марта 2012

Я создал простую веб-службу RESTful (пока только для GET) с использованием Microsoft ASP.NET MVC 4 ApiController.

Сейчас я ищу правильный способ внедрения системы авторизации для сервиса. Я знаю, что не хочу использовать встроенный FormsAuthentication, так как я не хочу иметь уникальную страницу входа для всех приложений, использующих мой WS; более того, это нарушает парадигму RESTful, вызывая перенаправление и не уведомляя клиента с правильным 401 кодом состояния.

Итак, я отключил FormsAuthentication, удалив следующие строки из моего web.config:

<authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

и добавление следующего:

<modules runAllManagedModulesForAllRequests="true">
    <remove name="FormsAuthentication" />
</modules>

У меня уже есть ApiController для управления регистрацией пользователя, который в основном проверяет учетные данные в моей базе данных и возвращает пользователя или 401, если учетные данные недействительны.

Я прочитал, что мне нужно реализовать API Membership и Authorization, но я не нашел ничего, что помогло бы мне делать это с нуля. Есть ли у вас какие-либо идеи? Нужно ли мне управлять файлами cookie и кодами авторизации в базе данных или есть класс, аналогичный FormsAuthentication, который делает это для меня?

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

Я нашел решение, я просто использовал обходной путь, показанный Microsoft в примере .

  1. Создайте папку с именем App_Start.
  2. Поместите два классов с соответствующими пространствами имен.
  3. FormsAuthentication и добавленная система обработки запросов / ответов сделают все остальное.

Поскольку ямне не понравилось "Содержимое, перемещенное сюда" в моем ответе 401, я отредактировал метод OnEndRequest следующим образом:

private void OnEndRequest(object source, EventArgs args)
    {
        var context = (HttpApplication)source;
        var response = context.Response;

        if (context.Context.Items.Contains("__WEBAPI:Authentication-Fixup"))
        {
            response.StatusCode = (int)context.Context.Items[FixupKey];
            response.RedirectLocation = null;
            // Clear the page content, since I don't want the "Content moved here." body
            response.ClearContent();
        }
    }

Ссылки:

3 голосов
/ 28 марта 2012

Вы можете написать пользовательский обработчик сообщений для обработки аутентификации.Доминик Байер написал превосходную серию постов в блоге , в которой углубился в детали.

2 голосов
/ 28 марта 2012

Оформить заказ на этот проект на github .Они разработали несколько классов с примерами для повышения безопасности веб-API ASP.NET.Одна из поддерживаемых моделей безопасности - базовая аутентификация, которая, по-видимому, соответствует тому, что вы описываете в своем вопросе.

...