Средство проверки подлинности ASP.NET Core 2.0

С Core 1.1 последовал за советом @ blowdart и реализовал собственное промежуточное ПО:

https://stackoverflow.com/a/31465227/29821

Он работал следующим образом:

  1. Началось промежуточное ПО. Поднял токен из заголовков запросов.
  2. Проверял токен и, если он был создан, создал идентификатор (ClaimsIdentity), содержащий несколько претензий, которые затем добавлены через HttpContext.User.AddIdentity ();
  3. В ConfigureServices с использованием services.AddAuthorization Я добавил политику, требующую требования, предоставляемые промежуточным программным обеспечением.
  4. В 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? Я не вижу примера для подлинной аутентификации.

Таким образом, после долгого дня, пытаясь решить эту проблему, я, наконец, понял, как 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 HandleAuthenticateAsync()

Я добавил в наше старое промежуточное ПО для настройки претензий с помощью пользовательского сервера токенов и по-прежнему сталкивался с некоторыми проблемами с разрешениями, просто выплевывая 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 обесценивается и не поддерживается в будущих версиях. Полный пример того, как вставлять преобразование пользовательских претензий и выполнять авторизацию в представлении заявки на этот пост в блоге .

  • Entity Framework 4.1 Атрибут InverseProperty и ForeignKey
  • Что такое простой прокси-сервер C ++ (VC ++)?
  • Уменьшение использования памяти приложений .NET?
  • Кросс-платформенный способ получить номер строки INI-файла, где указан данный параметр
  • Entity Framework: как отключить ленивую загрузку для конкретного запроса?
  • Как распечатать время в формате: 2009-08-10 18: 17: 54.811
  • Интересное поведение компилятора с пространствами имен
  • Использовать GOTO или нет?
  • Чтение данных из XML
  • Почему polymorphism не работает без указателей / ссылок?
  • Web API 2: как вернуть JSON с именами свойств camelCased, на объекты и их под-объекты
  • Давайте будем гением компьютера.