Реализация аутентификации и авторизации на основе ролей в ASP.NET служба веб-API MVC и архитектура клиента MVC
Мне трудно решить подход при реализации сценария аутентификации/авторизации для моего проекта архитектуры Web API (Service) - MVC (client). Несмотря на то, что я реализовал пользовательскую аутентификацию на основе токенов в проекте Web API, мне сложно, где именно я должен реализовать авторизацию (в клиенте или в самом API).
Обзор Архитектуры :
- Решение
|
| __ ASP.NET служба REST на основе веб-API (независимо размещенная на IIS в M/C 1)
|
/ _ _ ASP.NET клиент на основе MVC (независимо размещенный на IIS в M/C 2, потребляющий службу REST)
|
/ _ _ Клиентское приложение Smart phone (потребляющее услугу REST)
уже реализована аутентификация:
аутентификация на основе маркеров в веб-API (с использованием обработчика сообщений) - который генерирует маркер SHA1 для аутентифицированный пользователь, который должен быть частью каждого заголовка http-запроса для аутентификации.
(Токен = имя пользователя + IP пользователя)защищенный SSL HTTP-запрос. (Опять Же, Используя Обработчик Сообщений)
актуальные проблемы :
- на каком уровне должна быть реализована авторизация?
- как роль пользователя должна сохраняться в клиенте? Используя Cookies? или добавление сведений о роли в Маркер сам (который может добавить накладные расходы для API для расшифровки информации и дополнительных вызовов БД для получения разрешений, связанных с этой ролью)
- как маркер аутентификации должен сохраняться в сеансе клиента?
- поскольку мое приложение является приложением SPA MVC, каков наилучший способ включить токен аутентификации в качестве части каждого вызова AJAX, который я делаю в API?
надеюсь, я не делаю что-то неправильно, принимая весь концепция аутентификации / авторизации в рассмотрении. Таким образом, я буду признателен за любой альтернативный подход/предложение.
2 ответов
прежде всего, я думаю, что никогда не стоит изобретать свой собственный механизм аутентификации.
чтобы ответить на ваши текущие проблемы:
1 вообще говоря, вы всегда хотите защитить свой Api с помощью аутентификации, так как это место, где вы получаете доступ к своим данным. Ваш клиент (приложение MVC / смартфон) должен авторизоваться, чтобы получить доступ к вашему Api.
2 & 3 Поскольку вы используете REST Api, я бы предложил держите Api без состояния, другими словами, Не храните информацию о сеансе. Просто включите необходимые данные роли в Маркер. Вы можете использовать, например,JSON Web Token.
4 Я всегда буду использовать заголовок authorization для отправки данных авторизации. В вашем DelegatingHandler (обратите внимание на разницу MessageHandler MVC, DelegatingHander HTTP) вы можете просто получить заголовок.
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
var authorizationHeader = request.Headers.Authorization;
// Your authorization logic.
return base.SendAsync(request, cancellationToken);
}
подробнее о том, как включить заголовок авторизации в вызове ajax см.:как использовать базовую аутентификацию с jQuery и AJAX?
дополнительная информация:
на вашем месте я бы также взглянул на сервер идентификации Thinktecture:https://github.com/thinktecture/Thinktecture.IdentityServer.v2
и, возможно, этот ответ об аутентификации службы REST также поможет вам: аутентификация службы REST
зачем создавать всю систему токенов (если вы не используете какую-то федеративную безопасность), у вас есть аутентификация форм и файлы cookie, как только файл cookie установлен и возвращен, браузер отправит файл cookie с любыми запросами AJAX, сделанными вашим SPA.