从 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--.net core 3.1 部署到 IIS
如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?