Проміжне програмне забезпечення для автентифікації ASP.NET Core 2.0


89

З Core 1.1 слідували порадам @ blowdart та впровадили власне проміжне програмне забезпечення:

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

Це працювало так:

  1. Проміжне програмне забезпечення працювало. Вибрав маркер із заголовків запиту.
  2. Перевірив маркер і, якщо дійсний, побудував ідентичність (ClaimsIdentity), яка містила кілька претензій, які потім він додав через HttpContext.User.AddIdentity ();
  3. У ConfigureServices, що використовують services.AddAuthorization, я додав політику, яка вимагає заявки, яку надає проміжне програмне забезпечення.
  4. У контролерах / діях я б тоді використовував [Авторизувати (Ролі = "якусь роль, яку додало проміжне програмне забезпечення")]

Це дещо працює з 2.0, за винятком того, що якщо маркер не дійсний (крок 2 вище) і заява ніколи не додається, я отримую "Не було вказано схему аутентифікації, і не знайдено схеми DefaultChallengeScheme."

Отже, зараз я читаю, що змінено аутентифікацію в 2.0:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

Який правильний шлях для мене робити те саме в ASP.NET Core 2.0? Я не бачу прикладу для справді власної автентифікації.


Спробуйте це посилання, хоча в ньому сказано 2 схеми, але це дасть вам змогу пройти
Mithun Pattankar

не могли б ви додати свій код, щоб ми могли поглянути? Я знаю, що у мене були проблеми з JWT в core2.0 - це був випадок його переміщення в стартапі
Webezine

Відповіді:


194

Отже, після довгого дня спроб вирішити цю проблему, я нарешті зрозумів, як Microsoft хоче, щоб ми створили власні обробники автентифікації для їх нової установки проміжного програмного забезпечення в ядрі 2.0.

Переглянувши частину документації про MSDN, я знайшов клас із назвою, AuthenticationHandler<TOption>який реалізує IAuthenticationHandlerінтерфейс.

Звідти я знайшов цілу базу коду з існуючими схемами автентифікації, розташованими за адресою https://github.com/aspnet/Security

Усередині одного з них показано, як Microsoft реалізує схему автентифікації JwtBearer. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )

Я скопіював більшу частину цього коду в нову папку і очистив усі речі, пов'язані з цим JwtBearer.

У JwtBearerHandlerкласі (який розширюється AuthenticationHandler<>) є перевизначення дляTask<AuthenticateResult> HandleAuthenticateAsync()

Я додав у наше старе проміжне програмне забезпечення для встановлення заявок через власний сервер маркерів, і все ще стикався з деякими проблемами з дозволами, просто випльовуючи 200 OKзамість a, 401 Unauthorizedколи маркер був недійсним, а претензій не було налаштовано.

Я зрозумів, що перевизначив, Task HandleChallengeAsync(AuthenticationProperties properties)що з якоїсь причини використовується для встановлення дозволів через [Authorize(Roles="")]контролер.

Після видалення цієї заміни код працював і успішно видавав, 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<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}

Створіть новий файл CustomAuthOptions.cs

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

Створіть новий файл CustomAuthHandler.cs

internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}

1
чудовий пост, але у мене виникають проблеми зі складанням вашого коду. Типи CustomAuthOptions та AuthenticateResult відсутні. Не могли б ви їх опублікувати?
alexb

8
Чи готові ви поділитися своїми висновками у коді на репозиторії Github?
CSharper

2
Не могли б ви пояснити DefaultAuthenticateSchemeі DefaultChallengeScheme? Я не розумію, чому вони обидва використовуються? і в чому різниця між ними.
Мохаммед Нурелдін,

11
+1 для "Звідти я знайшов цілу базу коду з існуючими схемами автентифікації, розташованими за адресою github.com/aspnet/Security ." Просто подивіться, як це робить команда ASP.NET, дотримуючись цієї відповіді (справді чудової). Хто-небудь із нас коли-небудь думав, що одного разу ми будемо задавати питання коду та практик MS, і відповідь буде: "просто погляньте на їх кодову базу?"
Марк Л.,

3
Для інших, хто прийде пізніше, вам AuthExtensionпотрібно бути всередині Microsoft.Extensions.DependencyInjectionпростору імен. Дивіться цей приклад: github.com/aspnet/Security/blob/rel/2.0.0/src/…
Гаррі Поллі,

4

Як зазначено у статті, на яку ви посилаєтесь, в Identity відбулися значні зміни від Core 1.x до Core 2.0 Основна зміна - це відхід від підходу проміжного програмного забезпечення та використання ін’єкції залежностей для налаштування користувацьких служб. Це забезпечує набагато більшу гнучкість у налаштуванні ідентичності для більш складних реалізацій. Тож ви хочете піти від підходу проміжного програмного забезпечення, про який ви згадали вище, і перейти до послуг. Для досягнення цієї мети виконайте кроки міграції у статті, на яку посилається. Почніть із заміни app.UseIdentity на app.UseAuthentication . UseIdentity знецінено і не буде підтримуватися в наступних версіях. Повний приклад того, як вставити власне перетворення претензій та виконати авторизацію претензіїпереглянути цей допис у блозі .


12
Чи є приклад того, як використовувати це з додатком WebAPI?
alexb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.