C# Web API中JWT令牌存储、接口授权与测试问题咨询
C# Web API JWT授权实操指南
一、限制接口仅允许授权用户访问
- 完善中间件配置:在
Program.cs中添加认证和授权中间件,顺序需放在UseRouting之后、UseEndpoints之前:
app.UseAuthentication(); app.UseAuthorization();
- 添加授权特性:给需要保护的控制器或Action打上
[Authorize]特性,登录接口必须加[AllowAnonymous](否则无法登录获取令牌):
[ApiController] [Route("api/[controller]")] [Authorize] // 整个控制器下的接口都需要授权 public class UserController : ControllerBase { [HttpGet] public IActionResult GetUsers() => Ok("仅授权用户可见"); [HttpPost] public IActionResult CreateUser(User user) => Ok("创建成功"); } // 登录接口示例 [ApiController] [Route("api/auth")] [AllowAnonymous] public class AuthController : ControllerBase { [HttpPost("login")] public IActionResult Login(LoginRequest request) { // 校验用户凭据,生成JWT令牌并返回 } }
二、程序如何识别用户登录状态
服务器通过JWT令牌的有效性判断用户是否登录,流程如下:
- 客户端请求时,需将令牌放在请求头的
Authorization字段,格式为Bearer <token> - 服务器的JWT中间件会自动验证令牌的签名、有效期、发行方、受众等(对应你配置的
TokenValidationParameters) - 验证通过后,用户的身份信息会存入
HttpContext.User,可在Action中直接调用:// 判断是否登录 bool isAuthenticated = User.Identity.IsAuthenticated; // 获取用户ID(假设生成令牌时添加了NameIdentifier声明) string userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
无需在User模型新增授权字段,授权状态由令牌有效性决定,用户身份信息已包含在JWT的声明中(生成令牌时需将用户ID、用户名等关键信息作为声明加入):
// 生成JWT示例代码 var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), new Claim(ClaimTypes.Name, user.Username) }; var token = new JwtSecurityToken( issuer: Configuration["Jwt:Issuer"], audience: Configuration["Jwt:Audience"], // 注意你配置里的笔误:原代码写的是Hwt:Audience,要改成Jwt:Audience claims: claims, expires: DateTime.Now.AddHours(1), signingCredentials: new SigningCredentials( new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])), SecurityAlgorithms.HmacSha256 ) ); return Ok(new { Token = new JwtSecurityTokenHandler().WriteToken(token) });
三、Swagger测试授权接口
给Swagger添加JWT支持,才能在页面中携带令牌测试:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); // 定义JWT安全方案 var securityScheme = new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "输入格式:Bearer <你的JWT令牌>" }; c.AddSecurityDefinition("Bearer", securityScheme); // 全局启用授权要求 c.AddSecurityRequirement(new OpenApiSecurityRequirement { { securityScheme, Array.Empty<string>() } }); });
启动API后,打开Swagger页面,点击右上角「Authorize」按钮,输入Bearer <你的令牌>,点击确认后,所有接口请求都会自动带上令牌。
四、Postman测试授权接口
- 调用登录接口,复制返回的JWT令牌
- 新建请求(如GET
api/users),在「Headers」标签中添加键Authorization,值为Bearer <你的令牌> - 发送请求,令牌有效则返回正常数据,无效/过期则返回401 Unauthorized
内容的提问来源于stack exchange,提问作者StarLink111
相关产品推荐
相关产品推荐

