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

ASP.NET Core Razor视图从JWT获取角色声明报错:找不到JwtSecurityTokenHandler

咱们一步步来解决这个问题,同时也聊聊在Razor视图中获取声明的更规范做法。

首先解决你遇到的「JwtSecurityTokenHandler找不到」错误

这个错误的核心是你缺少对应的NuGet包和命名空间引用:

  1. 安装必要的NuGet包
    JwtSecurityTokenHandler类属于System.IdentityModel.Tokens.Jwt包,你需要先安装它:
  • 使用Package Manager控制台:Install-Package System.IdentityModel.Tokens.Jwt
  • 或者用.NET CLI:dotnet add package System.IdentityModel.Tokens.Jwt
  1. 在Razor视图中添加命名空间引用
    在视图的最顶部加上这行代码,让视图能找到该类:
@using System.IdentityModel.Tokens.Jwt
  1. 优化你的解析代码(避免空引用异常)
    原代码里用First()如果找不到对应声明会直接抛出异常,建议改成FirstOrDefault()并做空值处理:
@{
    var jwtHandler = new JwtSecurityTokenHandler();
    var tokenContent = jwtHandler.ReadToken(tokenModel.Result) as JwtSecurityToken;
    
    // 安全获取角色声明
    var roleClaim = tokenContent?.Claims.FirstOrDefault(claim => claim.Type == "Role");
    var role = roleClaim?.Value ?? "未找到角色";
    
    // 安全获取邮箱声明
    var emailClaim = tokenContent?.Claims.FirstOrDefault(claim => claim.Type == "email");
    var email = emailClaim?.Value ?? "未找到邮箱";
}

更推荐的做法:利用ASP.NET Core的身份认证体系直接获取声明

其实你完全不需要手动解析JWT令牌——ASP.NET Core的JWT认证中间件会自动验证令牌,并将所有声明加载到HttpContext.User对象中。这种方式更简洁、更符合框架设计,还能避免手动处理令牌验证、过期检查等安全细节。

步骤1:确保已正确配置JWT认证中间件

先确认你的Program.cs里已经配置了JWT认证(如果还没配置的话):

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// 添加JWT认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            // 替换成你自己的配置项
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

// 添加授权服务
builder.Services.AddAuthorization();

// 省略其他服务配置...

var app = builder.Build();

// 启用认证和授权中间件(顺序很重要)
app.UseAuthentication();
app.UseAuthorization();

// 省略其他中间件配置...

app.Run();

步骤2:在Razor视图中直接访问User属性

配置完成后,你可以在任何Razor视图里直接通过User.Claims获取声明:

@{
    // 注意:声明类型要和你生成JWT时的配置一致,比如角色可能是"Role"或标准的ClaimTypes.Role
    var role = User.Claims.FirstOrDefault(c => c.Type == "Role" || c.Type == System.Security.Claims.ClaimTypes.Role)?.Value ?? "未找到角色";
    
    var email = User.Claims.FirstOrDefault(c => c.Type == "email" || c.Type == System.Security.Claims.ClaimTypes.Email)?.Value ?? "未找到邮箱";
}

<p>用户角色:@role</p>
<p>用户邮箱:@email</p>

为什么推荐第二种做法?

  • 更简洁:省去了手动解析令牌的繁琐代码
  • 更安全:中间件已经帮你处理了令牌的验证、过期、签名检查等安全逻辑
  • 符合职责分离:视图只负责展示数据,令牌解析这类逻辑交给框架处理更合理

内容的提问来源于stack exchange,提问作者Abhi Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:52:46