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

如何在ASP.NET Core MVC Web应用中传递并获取生成的JWT Token

解决方案

1. Token返回客户端与自动携带实现

针对ASP.NET Core MVC场景,优先选择HttpOnly Cookie存储Token的方案,无需前端额外处理,浏览器会自动在后续所有同域请求中携带Cookie,且HttpOnly属性可禁止JS读取Token,有效降低XSS攻击风险,实现步骤如下:

步骤1:修改登录控制器代码,将Token写入Cookie

在你生成Token成功后,添加Cookie写入逻辑:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(LoginDto dto)
{
    if (ModelState.IsValid)
    {
        string token = _accountService.GenerateJwt(dto); //working

        if (token != null)
        {
            // 配置Cookie属性
            var cookieOptions = new CookieOptions
            {
                HttpOnly = true, // 禁止前端JS读取,防XSS
                Expires = DateTime.Now.AddDays(_authenticationSettings.JwtExpireDays), // 和JWT有效期一致
                Secure = Request.IsHttps, // HTTPS环境下自动开启,仅允许HTTPS请求携带
                SameSite = SameSiteMode.Lax // 防止CSRF攻击
            };
            // 写入Cookie,键名自定义为AccessToken
            Response.Cookies.Append("AccessToken", token, cookieOptions);
            return RedirectToAction("LoginSuccess");
        }
        else
        {
            ViewBag.error = "Login failed";
            return RedirectToAction("LoginFailed");
        }
    }
    // 补充ModelState无效的返回逻辑,避免编译报错
    return View(dto);
}

步骤2:修改JWT认证配置,支持从Cookie读取Token

默认JWT Bearer认证只会从Authorization请求头读取Token,需要额外配置事件,让认证中间件也从Cookie中读取Token:

.AddJwtBearer(cfg =>{
    cfg.RequireHttpsMetadata = false;
    cfg.SaveToken = true;
    cfg.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
    {
        ValidIssuer = authenticationSettings.JwtIssuer, 
        ValidAudience = authenticationSettings.JwtIssuer,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authenticationSettings.JwtKey)),
    };
    // 新增:配置从Cookie读取Token的逻辑
    cfg.Events = new JwtBearerEvents
    {
        OnMessageReceived = context =>
        {
            var accessToken = context.Request.Cookies["AccessToken"];
            if (!string.IsNullOrEmpty(accessToken))
            {
                context.Token = accessToken;
            }
            return Task.CompletedTask;
        }
    };
});

如果是前后端分离场景,可直接返回JSON格式的Token给前端,前端将Token存储在localStorage/sessionStorage中,后续所有请求主动在请求头中添加Authorization: Bearer <你的Token字符串>即可。

2. 其他控制器/方法中获取Token与用户信息

只要配置完上述认证逻辑,在需要校验登录的动作/控制器上添加[Authorize]特性,中间件会自动完成Token有效性校验,你可以直接通过User对象获取Token中存储的声明信息,也可以手动获取原始Token字符串:

// 加上[Authorize]特性,未登录/Token无效的请求会自动被拦截
[Authorize]
public IActionResult LoginSuccess()
{
    // 1. 直接获取Token中存储的声明信息(推荐)
    var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); // 用户ID
    var fullName = User.FindFirstValue(ClaimTypes.Name); // 用户姓名
    var email = User.FindFirstValue(ClaimTypes.Email); // 用户邮箱

    // 2. 获取原始Token字符串
    // 从Cookie获取
    var rawToken = Request.Cookies["AccessToken"];
    // 如果是前后端分离从请求头获取
    // var rawToken = Request.Headers["Authorization"].ToString().Replace("Bearer ", string.Empty);

    // 业务逻辑...
    return View();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:57:03