Я работаю с приложением ASP.NET Core. Я пытаюсь реализовать аутентификацию на основе токенов, но не могу понять, как использовать новую систему безопасности для моего случая. Я просмотрел примеры, но они мне мало чем помогли, они используют либо аутентификацию по cookie, либо внешнюю аутентификацию (GitHub, Microsoft, Twitter).
Мой сценарий таков: приложение angularjs должно запрашивать /token
URL, передавая имя пользователя и пароль. WebApi должен авторизовать пользователя и access_token
выполнить возврат, который будет использоваться приложением angularjs в следующих запросах.
Я нашел отличную статью о реализации именно того, что мне нужно в текущей версии ASP.NET - аутентификация на основе токенов с использованием ASP.NET Web API 2, Owin и Identity . Но для меня не очевидно, как сделать то же самое в ASP.NET Core.
У меня вопрос: как настроить приложение ASP.NET Core WebApi для работы с аутентификацией на основе токенов?
Ответы:
Обновление для .Net Core 3.1:
Дэвид Фаулер (архитектор группы ASP .NET Core) собрал невероятно простой набор приложений для задач, включая простое приложение, демонстрирующее JWT . Я скоро включу его обновления и упрощенный стиль в этот пост.
Обновлено для .Net Core 2:
Предыдущие версии этого ответа использовали RSA; это действительно не нужно, если ваш код, который генерирует токены, также проверяет токены. Однако, если вы распределяете ответственность, вы, вероятно, все еще хотите сделать это, используя экземпляр
Microsoft.IdentityModel.Tokens.RsaSecurityKey
.Создайте несколько констант, которые мы будем использовать позже; вот что я сделал:
Добавьте это к вашему Startup.cs
ConfigureServices
. Мы будем использовать внедрение зависимостей позже для доступа к этим настройкам. Я предполагаю, что выauthenticationConfiguration
- объектConfigurationSection
илиConfiguration
объект, такой, что у вас может быть другая конфигурация для отладки и производства. Убедитесь, что вы храните свой ключ надежно! Это может быть любая строка.Я видел, как другие ответы меняли другие настройки, такие как
ClockSkew
; Значения по умолчанию установлены так, что они должны работать для распределенных сред, часы которых не синхронизированы. Это единственные настройки, которые вам нужно изменить.Настройте аутентификацию. Вы должны иметь эту строку перед любым промежуточным ПО, которое требует вашей
User
информации, напримерapp.UseMvc()
.Обратите внимание, что это не приведет к тому, что ваш токен будет выдан вместе с
SignInManager
чем-либо еще. Вам нужно будет предоставить собственный механизм вывода вашего JWT - см. Ниже.Вы можете указать
AuthorizationPolicy
. Это позволит вам указать контроллеры и действия, которые разрешают использование только токенов Bearer в качестве аутентификации[Authorize("Bearer")]
.Здесь начинается сложная часть: создание токена.
Затем в вашем контроллере, где вы хотите свой токен, что-то вроде следующего:
Здесь, я полагаю, у вас уже есть директор. Если вы используете личность, вы можете использовать
IUserClaimsPrincipalFactory<>
для преобразованияUser
вClaimsPrincipal
.Чтобы проверить это : Получить маркер, поместите его в форму на jwt.io . Инструкции, которые я предоставил выше, также позволяют вам использовать секрет из вашей конфигурации для проверки подписи!
Если вы представляли это в виде частичного представления на своей HTML-странице в сочетании с аутентификацией только на предъявителя в .Net 4.5, теперь вы можете использовать a,
ViewComponent
чтобы сделать то же самое. Это в основном так же, как код действия контроллера выше.источник
IOptions<OAuthBearerAuthenticationOptions>
чтобы использовать Опции; прямое использование объекта параметров не поддерживается из-за именованной конфигурации, поддерживаемой платформой модели параметров.Работая сказочного ответ Matt Dekrey в , я создал полностью рабочий пример аутентификации на основе маркеров, работающий на ASP.NET Ядро (1.0.1). Вы можете найти полный код в этом репозитории на GitHub (альтернативные ветки для 1.0.0-rc1 , beta8 , beta7 ), но вкратце, важными шагами являются:
Создать ключ для вашего приложения
В моем примере я генерирую случайный ключ каждый раз, когда приложение запускается, вам нужно будет сгенерировать его и сохранить где-нибудь, а затем предоставить его вашему приложению. Посмотрите этот файл, чтобы узнать, как я генерирую случайный ключ и как вы можете импортировать его из файла .json . Как предложено в комментариях @kspearrin, API защиты данных кажется идеальным кандидатом для «правильного» управления ключами, но я пока не решил, возможно ли это. Пожалуйста, отправьте запрос на извлечение, если вы решите это!
Startup.cs - ConfigureServices
Здесь нам необходимо загрузить закрытый ключ для подписи наших токенов, который мы также будем использовать для проверки токенов по мере их представления. Мы храним ключ в переменной уровня класса,
key
которую мы будем использовать в методе Configure ниже. TokenAuthOptions - это простой класс, который содержит подписывающую личность, аудиторию и издателя, которые нам понадобятся в TokenController для создания наших ключей.Мы также установили политику авторизации, которая позволяет нам использовать
[Authorize("Bearer")]
конечные точки и классы, которые мы хотим защитить.Startup.cs - настроить
Здесь нам нужно настроить аутентификацию JwtBearer:
TokenController
В контроллере токенов необходим метод генерации подписанных ключей с использованием ключа, который был загружен в Startup.cs. Мы зарегистрировали экземпляр TokenAuthOptions в автозагрузке, поэтому нам нужно добавить его в конструктор TokenController:
Затем вам нужно сгенерировать токен в вашем обработчике для конечной точки входа в систему, в моем примере я беру имя пользователя и пароль и проверяю их с помощью оператора if, но главное, что вам нужно сделать, это создать или загрузить заявку на основе личности и сгенерировать токен для этого:
И это должно быть так. Просто добавьте
[Authorize("Bearer")]
к любому методу или классу, который вы хотите защитить, и вы получите сообщение об ошибке, если попытаетесь получить к нему доступ без маркера. Если вы хотите вернуть ошибку 401 вместо ошибки 500, вам нужно зарегистрировать пользовательский обработчик исключений, как в моем примере здесь .источник
Вы можете взглянуть на примеры подключения OpenId, которые иллюстрируют, как работать с различными механизмами аутентификации, включая токены JWT:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
Если вы посмотрите на проект Cordova Backend, конфигурация для API выглядит следующим образом:
Также стоит взглянуть на логику в /Providers/AuthorizationProvider.cs и RessourceController этого проекта;).
В качестве альтернативы вы также можете использовать следующий код для проверки токенов (также есть фрагмент, чтобы заставить его работать с signalR):
Для выдачи токена вы можете использовать пакеты сервера openId Connect следующим образом:
РЕДАКТИРОВАТЬ: я реализовал одностраничное приложение с аутентификацией на основе токенов, используя интерфейсную среду Aurelia и ядро ASP.NET. Есть также сигнал R постоянного соединения. Однако я не сделал никакой реализации БД. Код можно посмотреть здесь: https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
Надеюсь это поможет,
Лучший,
Alex
источник
Взгляните на OpenIddict - это новый проект (на момент написания), который позволяет легко настроить создание токенов JWT и обновить токены в ASP.NET 5. Проверка токенов выполняется другим программным обеспечением.
Предполагая, что вы используете
Identity
сEntity Framework
, последняя строка - это то, что вы добавили бы в свойConfigureServices
метод:В
Configure
, вы настроили OpenIddict для обслуживания токенов JWT:Вы также настраиваете проверку токенов в
Configure
:Есть одна или две второстепенные вещи, например, ваш DbContext должен быть получен из OpenIddictContext.
Вы можете увидеть подробное объяснение в этом блоге: http://capesean.co.za/blog/asp-net-5-jwt-tokens/
Функциональная демонстрация доступна по адресу: https://github.com/capesean/openiddict-test
источник