User.Claims пуст после обновления с ASP.NET Core 3.1 до ASP.NET 5.0

После обновления с ASP.NET Core 3.1 до версии 5 context.User.Claims пусто в

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)

в

public class MyRequirementHandler : AuthorizationHandler<MyRequirement>

Я использую Authorizationзаголовок с токеном-носителем с JWT. Я вижу, что заголовок установлен правильно, глядя на HttpContext.Request.Headers но вроде не разбирается.

Это настроено на сервисе Grpc с [Authorize] атрибут.

С ASP.NET Core 3.1 все работало нормально. Я просмотрел официальное руководство по миграции, но его ссылки на авторизацию относятся только к Azure Active Directory.

Я использую IdentityServer4, который размещен в этом приложении ASP.NET Core в качестве промежуточного программного обеспечения (app.UseIdentityServer();)

Что я забыл изменить, чтобы ASP.NET Core правильно анализировал заголовок авторизации?

Обновить:

Я проверил его более подробно и заметил, что он не работает, потому что он не может проверить аудиторию (aud) - и да, на вновь созданных токенах аудитория отсутствует (у старых токенов была аудитория). Также я заметил, что настраиваемая область, которую я добавляла в

public override async Task GetProfileDataAsync(ProfileDataRequestContext context)

внутри моего обычая

public class ProfileService : ProfileService<ApplicationUser>

также отсутствует после обновления. Вот как настроен IdentityServer:

services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, AppIdentityDbContext>()
    .AddProfileService<ProfileService>()
    .AddInMemoryIdentityResources(AuthResources.GetIdentityResources())
    .AddInMemoryApiResources(AuthResources.GetApiResources())
    .AddInMemoryClients(TestClientsRequired
        ? ClientsForTesting.GetTestClients()
        : Clients.GetDefaultClients());

1 ответ

Решение

Выяснив, что проблема могла быть в отсутствии аудитории (audЯ поискал дальше и обнаружил, что в токене доступа отсутствует утверждение "aud" - ответ был: явно добавить аудиторию в качестве утверждения, а также еще раз установить область действия, и это сработало.

Для меня это выглядит так:

public static IEnumerable<ApiResource> GetApiResources()
{
    yield return ApiResourceBuilder
        .IdentityServerJwt(MyWebApiResource)
        .AllowAllClients()
        .Build()
        .AddUserClaims()
        .AddScopes(); // <- this is new
}

private static T AddUserClaims<T>(this T resource)
    where T : Resource
{
    resource.UserClaims.Add(Constants.CustomClaimTypes.MyRoles);
    resource.UserClaims.Add(JwtClaimTypes.Audience); // <- this is new

    return resource;
}

// this whole method is new ->
private static T AddScopes<T>(this T resource)
    where T : ApiResource
{
    resource.Scopes.Add(MyWebApiResource);

    return resource;
}
Другие вопросы по тегам