Средство проверки подлинности ASP.NET Core 2.0
С Core 1.1 последовал за советом @ blowdart и реализовал собственное промежуточное ПО:
https://stackoverflow.com/a/31465227/29821
Он работал следующим образом:
- Глобальный Ключ для клавиатуры от службы Windows
- При чтении CSV-файла с использованием DataReader и поставщика данных OLEDB Jet, как я могу управлять типами данных столбцов?
- Как я могу выделить структуру, которая содержит массив переменного размера для C #?
- Использование GCC для создания читаемой сборки?
- Отправка почты без установки SMTP-сервера
- Началось промежуточное ПО. Поднял токен из заголовков запросов.
- Проверял токен и, если он был создан, создал идентификатор (ClaimsIdentity), содержащий несколько претензий, которые затем добавлены через HttpContext.User.AddIdentity ();
- В ConfigureServices с использованием services.AddAuthorization Я добавил политику, требующую требования, предоставляемые промежуточным программным обеспечением.
- В controllerах / действиях я бы затем использовал [Authorize (Роли = «некоторая роль, добавленная промежуточным ПО»)]
Это несколько работает с 2.0, за исключением того, что если токен недействителен (шаг 2 выше), и требование никогда не добавляется, я получаю «Нет идентификатора_идентификации, и не было обнаружено DefaultChallengeScheme».
Итак, теперь я читаю, что auth изменился в версии 2.0:
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
Каков правильный путь для меня сделать то же самое в ASP.NET Core 2.0? Я не вижу примера для подлинной аутентификации.
- Переместить конструктор для std :: mutex
- Что такое представитель underscore в Swift References?
- C #: Как сделать Сито Аткина инкрементным
- Исключение, когда параметр AddWithValue равен NULL
- Как cin Space в c ++?
- Найдите n простых чисел после заданного простого числа без использования какой-либо функции, которая проверяет правильность
- Передача данных между формами
- Доступ к защищенным членам в производном classе
Таким образом, после долгого дня, пытаясь решить эту проблему, я, наконец, понял, как Microsoft хочет, чтобы мы сделали пользовательские обработчики проверки подлинности для своей новой установки однопользовательского ПО в основном 2.0.
AuthenticationHandler
некоторую документацию по MSDN, я нашел class под названием AuthenticationHandler
который реализует интерфейс IAuthenticationHandler
.
Оттуда я нашел целую базу кода с существующими схемами аутентификации, расположенными по адресу https://github.com/aspnet/Security
Внутри одного из них он показывает, как Microsoft реализует схему аутентификации JwtBearer. ( https://github.com/aspnet/Security/tree/dev/src/Microsoft.AspNetCore.Authentication.JwtBearer )
Я скопировал большую часть этого кода в новую папку и очистил все, что связано с JwtBearer
.
В classе JwtBearerHandler
(который расширяет AuthenticationHandler<>
) существует переопределение для Task
Я добавил в наше старое промежуточное ПО для настройки претензий с помощью пользовательского сервера токенов и по-прежнему сталкивался с некоторыми проблемами с разрешениями, просто выплевывая 200 OK
вместо 401 Unauthorized
когда токен был недействительным и никаких претензий не было установлено.
Я понял, что переопределил Task HandleChallengeAsync(AuthenticationProperties properties)
который по какой-либо причине используется для установки разрешений через [Authorize(Roles="")]
в controllerе.
После удаления этого переопределения код работал и успешно сбросил 401
когда разрешения не совпали.
Основной вывод из этого заключается в том, что теперь вы не можете использовать специальное промежуточное программное обеспечение, вы должны реализовать его через AuthenticationHandler<>
и вы должны установить DefaultAuthenticateScheme
и DefaultChallengeScheme
при использовании services.AddAuthentication(...)
.
Вот пример того, как все это должно выглядеть:
В Startup.cs / ConfigureServices () добавьте:
services.AddAuthentication(options => { // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...) options.DefaultAuthenticateScheme = "Custom Scheme"; options.DefaultChallengeScheme = "Custom Scheme"; }) .AddCustomAuth(o => { });
В Startup.cs / Configure () добавьте:
app.UseAuthentication();
Создать новый файл CustomAuthExtensions.cs
public static class CustomAuthExtensions { public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action configureOptions) { return builder.AddScheme("Custom Scheme", "Custom Auth", configureOptions); } }
Создайте новый файл CustomAuthOptions.cs
public class CustomAuthOptions: AuthenticationSchemeOptions { public CustomAuthOptions() { } }
Создайте новый файл CustomAuthHandler.cs
internal class CustomAuthHandler : AuthenticationHandler { public CustomAuthHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { // store custom services here... } protected override async Task HandleAuthenticateAsync() { // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package return AuthenticateResult.NoResult(); } }
В Identity от Core 1.x до Core 2.0 произошли значительные изменения, так как в статье вы ссылаетесь. Основным изменением является уход от подхода промежуточного программного обеспечения и использование инъекции зависимостей для настройки пользовательских сервисов. Это обеспечивает гораздо большую гибкость при настройке Identity для более сложных реализаций. Поэтому вы хотите уйти от подхода промежуточного программного обеспечения, о котором вы упомянули выше, и перейти к услугам. Для достижения этой цели выполните действия по миграции в указанной статье. Начните с замены app.UseIdentity на app.UseAuthentication . UseIdentity обесценивается и не поддерживается в будущих версиях. Полный пример того, как вставлять преобразование пользовательских претензий и выполнять авторизацию в представлении заявки на этот пост в блоге .