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

Posted

技术标签:

【中文标题】从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后,User.Claims 为空【英文标题】:User.Claims is empty after upgrading from ASP.NET Core 3.1 to ASP.NET 5.0 【发布时间】:2021-02-26 17:49:55 【问题描述】:

从 ASP.NET Core 3.1 升级到版本 5 后,context.User.Claims 中为空

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)

public class MyRequirementHandler : AuthorizationHandler<MyRequirement>

我正在使用带有 JWT 的不记名令牌的 Authorization 标头。在查看 HttpContext.Request.Headers 时,我可以看到该标头设置正确,但似乎没有被解析。

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

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

我正在使用托管在该 ASP.NET Core 应用程序中的 IdentityServer4 作为中间件 (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());

【问题讨论】:

授权令牌的任何部分是否正确解析?这是一个新令牌,还是在迁移之前创建的? 它在我的开发环境中,所以它几乎已经创建并且没有解析任何令牌。虽然,我可以使用 jwt.io 验证令牌看起来是否正确。除了配置值之外,用户对象非常空,所以我假设没有任何内容被解析 【参考方案1】:

在确定问题可能是由于缺少受众 (aud) 后,我进一步查看并发现 Missing "aud" claim in access token - 答案是,明确将受众添加为声明并设置范围时间,它奏效了。

对我来说,这看起来如下:

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;

【讨论】:

我猜你在迁移过程中跳过了 Identityserver v4,从 3 跳到了 5。They changed a lot in 4。 我一直在使用 identityserver4 - 我将它与 asp.net core 3.1 一起使用,现在与 asp.net 5 一起使用 - 这很奇怪,可能是我之前的配置错误但不知何故起作用了 - 我没有不知道 不,Identityserver4 只是“Identityserver for .Net Core”的简称,它有其内部版本控制。版本 3.x 和 4.x 目标 asp.net core 3 和 5.x 适用于 .net 5。 啊,这就是你的意思,因为我以前在以前的项目中使用过identityserver3,而这个从一开始就使用identityserver4,这就是我感到困惑的原因。谢谢你的提示,我会仔细检查这个问题,看看我是否需要升级其他东西

以上是关于从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后,User.Claims 为空的主要内容,如果未能解决你的问题,请参考以下文章

发布到 ASP.NET Core 3.1 Web 应用程序时,“[FromBody]MyClass 数据”通常为空

从 2.2 迁移到 3.1 的 ASP.Net Core 解决方案在发布时不会运行

Asp.net Core 3.1-如何从控制器返回到 Razor 页面?

从 ASP.NET Core 2.2 升级到 3.0

ASP.NET Core--.net core 3.1 部署到 IIS

如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?