C#: Изменение утверждений с помощью промежуточного ПО в ASP.NET

В наши дни большинство веб-приложений используют OAuth 2.0 для аутентификации/авторизации пользователей. ASP.NET также имеет встроенную поддержку OAuth 2.0 с Azure AD, которую мы используем довольно часто.

Однако во многих проектах мы столкнулись с проблемой включения соответствующих требований с самого начала, потому что:

  • Команда управления AD разная
  • Существуют строгие политики, согласно которым мы не можем создавать тестовые AD
  • Мы еще не знаем, какой объем должен быть создан.

В такой заботе мы часто пренебрегаем настройками авторизации в контроллере, а зря. Чтобы избежать этого, я объясняю, как использовать промежуточное ПО для модификации переданного утверждения, чтобы мы могли подстроить JWT.

Есть несколько моментов, которые нужно держать в голове. (Отличный комментарий от @phlash909)

  • Если мы модифицируем JWT таким образом, мы больше не сможем передать его другому сервису.
  • Мы также можем передать его другому сервису, а не модифицировать утверждения напрямую, чтобы сохранить чистоту.

Web API

В этой статье я начну с обычного Web API с использованием шаблона.

dotnet new webapi -n modifyjwt
cd modifyjwt
start .modifyjwt.csproj
Вход в полноэкранный режим Выход из полноэкранного режима

Включите аутентификацию

Обратитесь к разделу Быстрый старт: Защита веб-API с помощью платформы идентификации Microsoft для включения аутентификации в Azure AD.

Добавьте область требований к существующему контроллеру

По умолчанию в существующем контроллере нет параметров авторизации.

1. Установите пакет Microsoft.Identity.Web nuget.

2. Добавьте атрибут [RequiredScope] в WeatherForecastController.cs. Я добавил ReadWeatherForecast в качестве требуемого диапазона.

[HttpGet(Name = "GetWeatherForecast")]
[RequiredScope("ReadWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = Random.Shared.Next(-20, 55),
        Summary = Summaries[Random.Shared.Next(Summaries.Length)]
    })
    .ToArray();
}
Вход в полноэкранный режим Выйти из полноэкранного режима

3. Запустите приложение и подтвердите, что вы не можете получить доступ к контроллеру.

Добавьте промежуточное ПО для изменения JWT

1. Добавьте класс промежуточного ПО.

using System.Security.Claims;

namespace modifyjwt;

public class MyAuthMiddleware
{
    private const string SCOPE_CLAIM_TYPE = "http://schemas.microsoft.com/identity/claims/scope";
    private readonly RequestDelegate _next;

    public MyAuthMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        if (context.User.Identity is not null
            && context.User.Identity.IsAuthenticated)
        {
            Claim scope = context.User.Claims.First(x => x.Type == SCOPE_CLAIM_TYPE);
            (context.User.Identity as ClaimsIdentity)?.RemoveClaim(scope);
            context.User.AddIdentity(new ClaimsIdentity(new List<Claim>()
            {
                new Claim(SCOPE_CLAIM_TYPE, "ReadWeatherForecast"),
            }));
        }

        // Call the next delegate/middleware in the pipeline.
        await _next(context);
    }
}

public static class MyAuthMiddlewareExtensions
{
    public static IApplicationBuilder UseMyAuthMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<MyAuthMiddleware>();
    }
}
Войдите в полноэкранный режим Выйдите из полноэкранного режима

2. Используйте его в Program.cs между UseAuthentication и UseAuthorization.

app.UseAuthentication();

app.UseMyAuthMiddleware();

app.UseAuthorization();
Вход в полноэкранный режим Выход из полноэкранного режима

3. Запустите приложение, чтобы убедиться, что оно работает.

Добавление нескольких диапазонов

Если нам нужно добавить несколько диапазонов, мы можем добавить их, разделяя каждый диапазон пробелом, например ReadWeatherForecast WriteWeatherForecast.

Резюме

В производстве мы должны получить все необходимые диапазоны из Azure AD, или, по крайней мере, получить их из источника данных, используя идентификатор пользователя.

  • ASP.NET Core Middleware
  • Защищенный веб-API: Проверка диапазонов и ролей приложений
  • Контроль доступа на основе ролей для разработчиков приложений

Оцените статью
devanswers.ru
Добавить комментарий