ASP.NET Core MVC中JWT认证配置求助:token多场景使用存疑
ASP.NET Core MVC中JWT认证的实现步骤
针对你的场景,MVC和Web API的JWT使用差异主要在于token的存储与传递方式——Web API通常让前端存token并手动加请求头,而MVC可以借助Cookie自动传递token,覆盖Razor页面、表单提交等所有场景,具体步骤如下:
1. 调整认证中间件配置
在Program.cs中,修改JWT认证服务的配置,让中间件支持从Cookie读取token:
// 添加认证服务 builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { // 保留你已有的token验证参数配置 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; // 核心配置:从请求Cookie中读取token options.Events = new JwtBearerEvents { OnMessageReceived = context => { context.Token = context.Request.Cookies["JwtToken"]; return Task.CompletedTask; } }; }); // 添加授权服务 builder.Services.AddAuthorization();
然后在中间件管道中启用认证和授权(注意顺序,必须在UseRouting之后、UseEndpoints之前):
app.UseRouting(); // 启用认证和授权 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
2. Login Action中存储Token到Cookie
生成token后,将其存入HttpOnly Cookie,这样后续所有请求会自动携带token:
public async Task<IActionResult> Login(LoginViewModel model) { // 保留你已有的用户验证逻辑 var user = await _userManager.FindByNameAsync(model.Username); if (user != null && await _userManager.CheckPasswordAsync(user, model.Password)) { // 调用你已实现的生成token方法 var token = GenerateJwtToken(user); // 将token存入Cookie Response.Cookies.Append("JwtToken", token, new CookieOptions { HttpOnly = true, // 禁止前端JS读取,防范XSS攻击 Secure = builder.Environment.IsProduction(), // 生产环境强制HTTPS传输 Expires = DateTime.UtcNow.AddHours(1), // 与token过期时间保持一致 SameSite = SameSiteMode.Strict // 防范CSRF攻击 }); // 跳转到需要认证的页面 return RedirectToAction("Index", "Dashboard"); } ModelState.AddModelError("", "用户名或密码错误"); return View(model); }
3. 保护需要认证的资源
在需要权限的控制器或Action上添加[Authorize]特性:
[Authorize] public class DashboardController : Controller { public IActionResult Index() { // 直接通过User对象获取当前用户信息 var currentUserName = User.Identity.Name; var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); return View(); } }
4. 实现Logout功能
清除存储token的Cookie即可:
public IActionResult Logout() { Response.Cookies.Delete("JwtToken"); return RedirectToAction("Login", "Account"); }
5. Razor页面中使用认证信息
在Razor视图里,可以直接通过User对象访问当前用户的认证信息:
<div class="user-info"> 欢迎登录:@User.Identity.Name <a asp-action="Logout" asp-controller="Account">退出</a> </div>
关键注意事项
- Cookie安全配置:
HttpOnly、Secure、SameSite三个属性必须按场景配置,避免安全漏洞。 - token过期同步:Cookie的
Expires时间要和你生成token时设置的过期时间保持一致,避免token失效后Cookie仍存在。 - 中间件顺序:
UseAuthentication和UseAuthorization必须放在UseRouting之后,否则认证逻辑不会生效。
内容的提问来源于stack exchange,提问作者Adda Issa Abdoul Razak
相关产品推荐
相关产品推荐

