Как ValidateAntiForgeryToken совместим с веб-API, доступ к которым можно получить через веб-сайт или собственное приложение?

Я пытаюсь понять, как мне удастся создать API-интерфейс с использованием веб-API ASP.NET, который будет защищен от CSRF, но при этом будет доступен из не-веб-сред (например, нативных мобильных приложений).

Первой моей мыслью было бы то, что не-веб-среда никогда не сможет успешно пройти проверку токена подделки, поскольку у нее нет формы, которая будет опубликована. Это правда? Есть ли способ сделать проверку работы?

Если нет способа проверить, моя вторая мысль состоит в том, чтобы предложить API, который проверяет токены против подделки для веб-вызовов, но не для не-веб-вызовов. Однако, похоже, что злоумышленник с такой же легкостью сможет использовать этот "не веб" API для атаки CRSF, верно?

Является ли ответом то, что не-веб-API должен поддерживать только механизм не-веб-аутентификации (OAuth?), Чтобы запросы к нему не могли быть воспроизведены через браузер? Или есть более простой способ?

Если это единственный способ, есть ли простой способ отключить все небезопасные механизмы аутентификации? Разве не должно быть несколько простого / счастливого пути в ASP.NET Web API для поддержки этих сценариев?

3 ответа

Решение

CSRF становится проблемой только тогда, когда вы используете постоянный механизм аутентификации, такой как куки, базовая аутентификация, NTLM и т. Д. У Майка Уассона есть пример использования CSRF против webapi в Javascript - и я видел версии в DelegatingHandlers ....

Поскольку CSRF является проблемой только в веб-сценариях, вы можете утверждать, что нет реальной необходимости проверять не веб-запросы. Каждый ajax-запрос от браузера, будь то через jquery, собственные классы XmlHttpRequest или любой другой, поставляется с заголовком - X-Requested-With, который будет иметь значение XMLHttpRequest. Таким образом, вы можете ограничить свои проверки CSRF только запросами с этим заголовком, так как все, что без него, должно быть получено извне браузера.

Сказав, что если вы аутентифицируетесь, я посмотрю на какой-нибудь общий секрет или механизм OAuth и укажу для проверки сторону сервера DelegatingHandler, а в веб-приложении просто поместите токен куда-нибудь, чтобы его можно было получить с помощью javascript и отправляется через заголовок X-Authentication - так как он не является постоянным и должен быть присоединен к каждому запросу (как токен CSRF), проблем с CSRF нет. Доминик, как всегда, хорошо документирует подобные вещи.

Взгляните на реализацию CORS для WebAPI.

http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api-rc-version.aspx

Тогда вы могли бы разрешить только localhost в качестве действительного URI на сервере webapi. Это не позволит другим сайтам загружать код атаки в браузер.

Посмотрите шаблоны SPA в последнем обновлении MVC4. У них есть пример реализации Anti-CSRF для веб-API.

Другие вопросы по тегам