可能的解决方案如下:
使用以下代码,确保已经成功验证并设置了用户:
var user = await _userManager.GetUserAsync(context.User);
if (user == null) { context.Fail("Unauthorized"); return; }
如果HttpContext.User未设置,则AuthorizationHandlerContext将无法返回用户。因此,请确保HttpContext.User已设置:
var user = await _userManager.GetUserAsync(context.User);
if (user == null) { context.Fail("Unauthorized"); return; }
var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimsIdentity.DefaultNameClaimType, user.Email) })); context.HttpContext.User = claimsPrincipal;
如果当前用户不是使用策略所需的AuthenticationScheme进行验证的,则AuthorizationHandlerContext将返回null。因此,请确保策略正在使用正确的AuthenticationScheme:
services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) // 此处添加所需的AuthenticationScheme .Build(); });
如果您正在使用自定义策略,请确保所有的要求都被正确地满足。在以下代码示例中,我们创建了一个需要“admin”角色的策略。请验证用户是否具有“admin”角色:
services.AddAuthorization(options => { options.AddPolicy("RequireAdmin", policy => { policy.RequireRole("admin"); }); });
var user = await _userManager.GetUserAsync(context.User);
if (user == null) { context.Fail("Unauthorized"); return; }
if (!await _userManager.IsInRoleAsync(user, "admin")) { context.Fail("Unauthorized"); return; }