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

ASP.NET多API认证咨询:JWT传递、存储与跨API会话实现

微服务JWT认证相关问题解答

问题1:JWT传递方式、API网关必要性与localStorage存储风险

  • JWT传递给其他API的方式:最通用的方案是由前端统一持有令牌,调用所有微服务API时,在请求头中携带Authorization: Bearer {token}。这种方式不需要API网关也能正常工作。
  • API网关不是必须项:网关能统一处理令牌校验、路由转发、限流等操作,减少各微服务的重复配置,但小型微服务集群完全可以不用网关,各服务独立处理认证逻辑。
  • localStorage存储JWT是不良实践:XSS攻击可直接读取localStorage中的内容,一旦令牌被盗,攻击者可完全冒充用户执行操作。更安全的方案是用带HttpOnly、Secure、SameSite属性的Cookie存储JWT。

问题2:Cookie存储JWT与其他API的认证会话创建

  • 可以用Cookie传递JWT:只要所有微服务处于同一主域名或信任的子域名下(如auth.example.com、order.example.com),浏览器会自动将符合域名规则的Cookie携带到对应API请求中。
  • 其他API创建认证会话的步骤(以ASP.NET Core为例):
    1. 配置JWT认证中间件:在各微服务的Program.cs中添加认证授权配置,确保和认证服务使用相同的密钥、签发者、受众参数,并指定从Cookie中提取令牌:
      builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
          .AddJwtBearer(options =>
          {
              options.TokenValidationParameters = new TokenValidationParameters
              {
                  ValidateIssuer = true,
                  ValidateAudience = true,
                  ValidateLifetime = true,
                  ValidateIssuerSigningKey = true,
                  ValidIssuer = "你的认证服务签发者",
                  ValidAudience = "你的受众标识",
                  IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("共享的密钥字符串"))
              };
              // 从指定Cookie中提取JWT令牌
              options.Events = new JwtBearerEvents
              {
                  OnMessageReceived = context =>
                  {
                      context.Token = context.Request.Cookies["AuthToken"];
                      return Task.CompletedTask;
                  }
              };
          });
      builder.Services.AddAuthorization();
      
      随后在中间件管道中启用认证和授权:
      app.UseAuthentication();
      app.UseAuthorization();
      // 注意:这两行要放在app.UseRouting()之后,app.MapControllers()之前
      
    2. 认证服务写入JWT到Cookie:登录成功生成JWT后,将令牌写入Cookie并设置安全属性:
      var cookieOptions = new CookieOptions
      {
          HttpOnly = true, // 禁止前端JS读取,防范XSS
          Secure = true, // 仅在HTTPS请求中传输
          SameSite = SameSiteMode.Strict, // 限制Cookie仅在同站请求中发送,防范CSRF
          Expires = DateTime.UtcNow.AddHours(1) // 与JWT的过期时间保持一致
      };
      Response.Cookies.Append("AuthToken", generatedJwtToken, cookieOptions);
      
    3. 接口授权:在需要认证的接口上添加[Authorize]特性,中间件会自动校验Cookie中的JWT有效性,解析出声明信息(Id、Username、Balance、Roles等),并通过HttpContext.User提供用户身份,实现认证和授权逻辑。

核心困惑解答

  • 其他API如何获取令牌:用Cookie方案时,浏览器自动携带,无需额外操作;若用前端存储(不推荐),则前端需在每次请求时手动在Authorization头中添加Bearer {token}。
  • 各API创建认证/授权会话:通过配置统一的JWT认证中间件,服务会自动校验令牌、解析用户声明,HttpContext.User就是认证后的用户会话,接口可直接基于这个对象做权限判断,无需手动维护会话状态。

内容的提问来源于stack exchange,提问作者Andrеw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:10:28