В наши дни большинство веб-приложений используют 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: Проверка диапазонов и ролей приложений
- Контроль доступа на основе ролей для разработчиков приложений