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