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

.NET Core 2.1中如何隐式访问并解码JWT令牌获取用户UID?

在.NET Core 2.1中无需显式参数获取Firebase JWT的用户UID

嘿,我来帮你搞定这个问题!在你的.NET Core 2.1后端里,只要先正确配置Firebase JWT的认证中间件,框架就会自动帮你解码请求里的令牌,并把用户信息填充到上下文里,完全不需要显式传递参数。下面分两步来实现:

第一步:配置Firebase JWT认证中间件

首先你需要安装Microsoft.AspNetCore.Authentication.JwtBearer NuGet包,然后在Startup.cs里配置认证服务,让后端能识别并验证Firebase签发的JWT令牌:

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

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 先添加其他必要服务,比如MVC等...

        // 替换成你的Firebase项目ID
        var firebaseProjectId = "your-firebase-project-id";

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority = $"https://securetoken.google.com/{firebaseProjectId}";
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidIssuer = $"https://securetoken.google.com/{firebaseProjectId}",
                    ValidateAudience = true,
                    ValidAudience = firebaseProjectId,
                    ValidateLifetime = true
                };
            });

        // 配置你的Admin授权策略
        services.AddAuthorization(options =>
        {
            options.AddPolicy(Policies.Admin, policy =>
                policy.RequireAuthenticatedUser()
                      // 如果需要额外的Admin权限验证,可以在这里添加,比如检查特定Claim
                      );
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // 其他中间件配置(比如异常处理、静态文件等)...

        // 一定要启用认证和授权中间件,顺序不能错
        app.UseAuthentication();
        app.UseAuthorization();

        // 其他中间件(比如MVC路由)...
    }
}

第二步:在接口中获取用户UID

当认证配置完成后,只要接口通过[Authorize]注解授权,你就可以直接通过User属性(或者注入ClaimsPrincipal)获取解码后的JWT声明,Firebase的用户UID对应的是JWT里的sub声明(框架也会把它映射到ClaimTypes.NameIdentifier类型)。

方式1:使用内置的User属性

这是最常用的方式,ControllerBase自带的User属性就是当前授权用户的ClaimsPrincipal:

[HttpPost]
[Authorize(Policy = Policies.Admin)]
public async Task<IActionResult> CreateVehicle([FromBody]SaveVehicleResource vehicleResource)
{
    // 获取Firebase用户UID
    var userUid = User.FindFirst("sub")?.Value;
    // 或者用ClaimTypes.NameIdentifier,效果一样
    // var userUid = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

    if (string.IsNullOrEmpty(userUid))
    {
        return BadRequest("无法获取当前用户的UID");
    }

    // 接下来就可以用userUid做你需要的业务逻辑了
    // 比如关联车辆创建者、记录操作日志等...

    return Ok("车辆创建成功");
}

方式2:直接注入ClaimsPrincipal

如果你更喜欢显式注入的方式,也可以把ClaimsPrincipal作为方法参数,.NET Core会自动帮你绑定当前用户:

[HttpPost]
[Authorize(Policy = Policies.Admin)]
public async Task<IActionResult> CreateVehicle(
    [FromBody]SaveVehicleResource vehicleResource,
    ClaimsPrincipal currentUser)
{
    var userUid = currentUser.FindFirst("sub")?.Value;
    // 后续逻辑同上...
    return Ok();
}

关键说明

  • 为什么不需要显式传参?因为JWT认证中间件会自动从请求的Authorization头里提取Bearer令牌,解码验证通过后,把用户的所有声明(包括UID)填充到HttpContext.User中,授权通过的接口就能直接访问这些信息。
  • 确保你的Angular应用发送的请求正确携带了Authorization: Bearer <JWT_TOKEN>头,否则后端会返回401未授权,也就无法获取用户信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:38:48