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

C# Web API中JWT令牌存储、接口授权与测试问题咨询

C# Web API JWT授权实操指南

一、限制接口仅允许授权用户访问

  1. 完善中间件配置:在Program.cs中添加认证和授权中间件,顺序需放在UseRouting之后、UseEndpoints之前:
app.UseAuthentication();
app.UseAuthorization();
  1. 添加授权特性:给需要保护的控制器或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测试授权接口

  1. 调用登录接口,复制返回的JWT令牌
  2. 新建请求(如GET api/users),在「Headers」标签中添加键Authorization,值为Bearer <你的令牌>
  3. 发送请求,令牌有效则返回正常数据,无效/过期则返回401 Unauthorized

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:35:23