User.Claims 从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后为空

User.Claims is empty after upgrading from ASP.NET Core 3.1 to 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 header 和带有 JWT 的不记名令牌。在查看 HttpContext.Request.Headers 时,我可以看到 header 设置正确,但它似乎没有被解析。

这是在具有 [Authorize] 属性的 Grpc 服务上设置的。

使用 ASP.NET Core 3.1,它运行良好。我浏览了 official migration guide,但他们关于授权的参考仅适用于 Azure Active Directory。

我正在使用托管在 ASP.NET 核心应用程序中的 IdentityServer4 作为中间件 (app.UseIdentityServer();)

为了让ASP.NET核心正确解析授权header我忘记修改了什么?

更新:

我更详细地检查了它并注意到它失败了,因为它无法验证观众 (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());

在弄清楚问题可能是由于缺少受众 (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;
}