如何在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
相关产品推荐
相关产品推荐

