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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:40:50