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;
}