You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core Web API声明式授权403错误排查与实现咨询

问题排查与解决方案

核心问题

你当前的代码没有将用户在AspNetUserClaims表中的VIEW声明包含到JWT Token里。ASP.NET Core的声明式授权验证的是Token中携带的Claim,而非直接读取数据库内的Claims,所以即使数据库里存在正确的声明,Token里没有就会触发403 Forbidden。

修复步骤

1. 修改登录接口,添加用户所有Claims到Token

在UsersLoginController的Login方法中,补充获取用户的所有自定义声明并加入到Token的Claims集合中:

[HttpPost]
[Route("Login")]
public async Task<IActionResult> Login(LoginModel model)
{
    var user = await _userManager.FindByNameAsync(model.UserName);
    if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
    {
        // 获取用户角色
        var roles = await _userManager.GetRolesAsync(user);
        // 获取用户在AspNetUserClaims表中的所有声明
        var userClaims = await _userManager.GetClaimsAsync(user);
        
        IdentityOptions _options = new IdentityOptions();
        
        // 构建完整的Claims集合:基础信息 + 角色 + 自定义声明
        var claims = new List<Claim>
        {
            new Claim("UserID", user.Id.ToString()),
            new Claim(_options.ClaimsIdentity.RoleClaimType, roles.FirstOrDefault())
        };
        // 追加用户的所有自定义声明
        claims.AddRange(userClaims);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Expires = DateTime.UtcNow.AddDays(1),
            SigningCredentials = new SigningCredentials(
                new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.JWT_Secret)), 
                SecurityAlgorithms.HmacSha256Signature)
        };
        var tokenHandler = new JwtSecurityTokenHandler();
        var securityToken = tokenHandler.CreateToken(tokenDescriptor);
        var token = tokenHandler.WriteToken(securityToken);
        return Ok(new { token });
    }
    else
        return BadRequest(new { message = "Username or password is incorrect." });
}

2. 验证Token内容(可选但推荐)

登录获取Token后,用JWT解析工具(比如本地解析或在线工具)查看Token的Payload部分,确认是否包含"VIEW"类型的声明。如果存在,说明Token生成正确。

3. 确认授权策略配置(无需修改)

你在Program.cs中的授权策略配置是正确的,保持原样即可:

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("VIEW",
        policy => policy.RequireClaim("VIEW"));
});

额外注意事项

  • 确保AspNetUserClaims表中该用户的ClaimType是精确的"VIEW"(大小写敏感),如果是其他值比如"view"或"Permission.VIEW",需要同步修改授权策略中的对应值。
  • 若需混合角色与声明验证,可调整授权策略:
    options.AddPolicy("VIEW", policy => 
        policy.RequireRole("Admin")
              .RequireClaim("VIEW"));
    
  • 测试时确认Postman请求头正确携带Authorization: Bearer {你的Token},无拼写或格式错误。

内容的提问来源于stack exchange,提问作者abdul wahid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:40:29