Проверка подлинности одной страницы

Моя компания переписывает свой сайт электронной коммерции как одностраничное приложение, используя новые функции Web API/SPA в MVC 4. Мы не уверены в наилучшем способе обработки аутентификации.

Конкретные вопросы:

  • Как мы обрабатываем как зашифрованную, так и нешифрованную связь? Очевидно, что нам нужно использовать HTTPS для входа, учетной записи и проверки AJAX, но мы бы хотели использовать HTTP для просмотра каталога, чтобы избежать дорогостоящих SSL-рукопожатий, которые замедлят весь сайт. Это даже возможно для SPA, или мы застряли с HTTPS для всего?

  • Какую аутентификацию мы должны использовать? В основном наш сайт будет доступен из веб-браузера, поэтому файлы cookie могут быть в порядке. Но по дороге мы можем захотеть создать собственное приложение для iPhone. Предпочтительны ли базовая аутентификация, OpenId или OAUTH? Если да, то почему?

    • Если мы будем использовать Forms Auth и файлы cookie, будет ли исправлена ​​проблема перенаправления для выпуска MVC 4, или мне нужно использовать хак?
    • Если мы идем с базовой аутентификацией, как вы выполняете постоянные сеансы, чтобы пользователям не приходилось входить в систему при каждом повторном переходе на страницу.
    • Какие методы аутентификации хорошо поддерживаются ASP.NET MVC 4. Идеально было бы не писать много специализированного кода.

Заранее спасибо

Ответы

Ответ 1

1. Как мы обрабатываем как зашифрованные, так и нешифрованные сообщения? Мы застряли в одном протоколе, https, со спа?

Вы не придерживаетесь одного протокола. В спа-салоне вы можете использовать ajax для связи через http или https, в зависимости от того, какой вы выберете в любой момент времени. Я бы использовал https в любое время, когда вы отправляете конфиденциальную информацию, например, имя человека или дату рождения или учетные данные для входа.

Как только пользователь войдет на ваш сайт через https, ваш сервер может установить cookie для проверки подлинности для этого пользователя. Этот файл cookie должен быть зашифрованным значением, которое связывает их сеанс с сервером. Вы должны знать, что, если остальная часть вашего сайта использует http, вы рискуете, что этот файл cookie передается по проводу простым текстом. Несмотря на то, что содержимое файла cookie можно зашифровать, используя алгоритм шифрования по вашему выбору, злоумышленник может украсть этот файл cookie и разблокировать сеанс пользователя.

Это может не быть большой проблемой для вас, хотя, если им разрешено просматривать сайт и создавать корзину покупок. Как только пользователь будет готов к проверке, вы должны повторно аутентифицировать пользователя, по https, как своего рода двойную проверку, чтобы убедиться, что они не являются злонамеренным пользователем. Amazon делает это.

2. Какую аутентификацию мы должны использовать?

Хорошо, что все зависит от того, какие функции вы хотите, чтобы ваш сайт имел.

OAuth предназначен для просмотра веб-сервисов, которые вы можете разрешить другим сайтам с помощью делегированного доступа. Это означает, что если у вас есть пользователь, который хочет, чтобы другой сайт (сайт x) имел возможность доступа к функциям вашего сайта для своего профиля. Сайт x может перенаправить пользователя на конечную точку oauth на вашем сайте, которая будет аутентифицировать пользователя. Ваша конечная точка oauth спросит у пользователя, будет ли в порядке, чтобы определенные функции были разделены с сайтом x, и если пользователь согласен с токеном, будет сгенерирован. Пользователь передает этот токен на сайт x, где сайт x сделает серверным сервером вызовы на ваш сайт. Сайт x представит токен в вызовах, поэтому вызовы ваших служб будут делегированным вызовом доступа. OAuth - это способ предоставления другим сайтам делегированного доступа к вашим услугам. Надеюсь, я смог объяснить это ясно. Я не всегда хорош в этом.

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

Другим решением является WS-Federation. WS-Federation - это если у вас несколько сайтов, и вы хотите иметь 1 поставщик аутентификации, которому вы доверяете. Этот поставщик проверки подлинности может быть вашим, и в основном все ваши сайты говорят, что если вы хотите получить доступ к моему сайту, тогда вы должны сначала пройти аутентификацию с помощью моего провайдера проверки подлинности. Этот поставщик аутентификации может жить в отдельном домене и может выбрать любой механизм проверки подлинности, который он выбирает. Вы доверяете, что этот поставщик auth сделает все возможное, чтобы управлять учетными записями пользователей.

WS-Federation может быть чрезмерным, хотя если вы хотите только аутентификацию на своем сайте и не имеете нескольких сайтов. В этом случае я просто рекомендую сделать Аутентификацию форм, и это должно быть достаточно простым для выполнения. Существует множество примеров того, как это сделать, и Microsoft предоставляет множество решений, как это сделать. Вы должны изучить создание пользовательского поставщика членства.


Как только пользователь прошел аутентификацию с вашего сайта, вы должны создать файл cookie для проверки подлинности. Этот файл cookie связывает пользователя с их сеансом на сервере. Это относится ко всем сценариям, перечисленным выше. MVC 4 поддерживает все описанные выше сценарии.

Спасибо, и не стесняйтесь задавать больше вопросов, если я не был достаточно ясен.

** РЕДАКТИРОВАТЬ 12/1/2017 ** Возвращаясь к этому вопросу спустя годы, я узнал, что полагаться на файлы cookie для API на основе REST - это не очень хорошая идея. Вы не хотите создавать сеанс в своем веб-приложении, потому что это затрудняет масштабирование приложения. Итак, если вам нужна аутентификация, используйте HTTPS с некоторой формой аутентификации (BASIC, DIGEST, Token Based и т.д.). Таким образом, ваше приложение SPA-клиента будет устанавливать заголовок авторизации для каждого HTTP-запроса, а затем ваше приложение веб-сервера будет повторно аутентифицировать каждый запрос.

Ответ 2

Основным недостатком использования безопасности на основе форм в формате ASP.NET является то, что предполагается, что вам нужна веб-страница 401 при неудачной аутентификации (бесполезно, когда вы делаете вызов AJAX), и она действительно разработана для создания переадресаций, ломает весь шаблон SPA. Вы можете взломать его, но он не предназначен для этой цели.

Этот инструментарий может служить альтернативой модели ASP.NET. Пока не уверен, насколько зрелым оно...

http://www.fluentsecurity.net

Обратная связь.

Ответ 3

Я только начал работать с webapi, поэтому не считаю свой ответ автору. Я не эксперт по безопасности, хотя должен быть. Я столкнулся с теми же вопросами, что и вы, и нашел, как и вы, что нет никакого ответного ответа, хотя в любом случае в mvc webapi. Глядя на другие спецификации webapi, вы можете немного вдохнуть.

Самый простой способ, с которым я столкнулся, - это, конечно, использование SSL. Это позволит вам уйти с отправкой учетных данных в ясный текст в заголовке. Не нарушает покоя.

Мой api будет использовать SSL полностью, но я все равно хотел бы удвоить. Поэтому я отправляю зашифрованный ключ в querystring для всех моих запросов. В значительной степени способ аутентификации без cookie работает для сайта app без api, но mvc не играет с ним, поэтому я развернул собственное решение.

На мобильном сайте пользователь должен войти в систему, быть перенаправлен, в приложение с зашифрованным ключом, закодированным в js. Поэтому у него сначала будет файл cookie, основанный на файлах cookie, и будет отвечать за его защиту, сохранение паролей и т.д.

Другой потребитель api получит более постоянный "секрет" с сайта-разработчика еще, чтобы его сделать, и использовать его для проверки ключа.

Обычно аутентификация mvc является безстоящей, что означает, что билет никогда не был аннулирован на стороне сервера. Если вы управляете клиентом, вы можете просто игнорировать недействительные запросы cookie, если сервер выйдет из системы, и просто продолжайте повторное использование билета. Возможно, вы захотите отслеживать свою сторону на стороне сервера, но она не является апатридом, сомневайтесь, если она будет полезной, и, следовательно, масштабируемость приведет к удару. Но проверка подлинности очень важна, поэтому...