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

在C# ASP.NET中创建与验证JWT令牌的实现指导

ASP.NET(非Core)JWT令牌生成与加载实现

1. 准备工作:安装依赖包

首先在项目中通过NuGet安装System.IdentityModel.Tokens.Jwt包,这是实现JWT功能的核心依赖。

2. 生成JWT令牌(登录逻辑)

在登录页面的后台代码(比如Login.aspx.cs)中,实现令牌生成逻辑,严格使用你指定的类和方法:

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public partial class Login : System.Web.UI.Page
{
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        // 从登录表单获取并验证用户信息(此处模拟验证通过)
        string onlineId = "user123";
        string username = "admin";
        string role = "admin";

        // 1. 创建对称密钥:必须是32位以上的随机字符串(确保安全)
        var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_strong_32byte_secret_key_here"));

        // 2. 生成签名凭证
        var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

        // 3. 构造JWT载荷:添加需要携带的用户信息
        var payload = new JwtPayload
        {
            { "onlineId", onlineId },
            { "username", username },
            { "role", role },
            { "exp", DateTime.UtcNow.AddHours(2) }, // 令牌过期时间(UTC格式)
            { "iat", DateTime.UtcNow } // 令牌签发时间
        };

        // 4. 创建JWT头部
        var header = new JwtHeader(signingCredentials);

        // 5. 组装完整的JWT安全令牌
        var token = new JwtSecurityToken(header, payload);

        // 6. 生成最终的令牌字符串
        var tokenHandler = new JwtSecurityTokenHandler();
        string tokenString = tokenHandler.WriteToken(token);

        // 存储令牌:示例存入HttpOnly Cookie(防XSS攻击)
        Response.Cookies["AuthToken"].Value = tokenString;
        Response.Cookies["AuthToken"].HttpOnly = true;
        Response.Cookies["AuthToken"].Expires = DateTime.UtcNow.AddHours(2);

        // 跳转至主页
        Response.Redirect("Default.aspx");
    }
}

3. 页面加载时解析与使用JWT令牌

在需要验证的页面(比如Default.aspx.cs)的Page_Load方法中,读取并解析令牌:

using System.IdentityModel.Tokens.Jwt;

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // 从Cookie获取令牌
            string tokenString = Request.Cookies["AuthToken"]?.Value;
            if (!string.IsNullOrEmpty(tokenString))
            {
                try
                {
                    var tokenHandler = new JwtSecurityTokenHandler();
                    // 解析令牌(仅解析内容,如需验证签名/过期需额外配置)
                    JwtSecurityToken jwtToken = tokenHandler.ReadJwtToken(tokenString);

                    // 从载荷中提取用户信息
                    string onlineId = jwtToken.Payload["onlineId"]?.ToString();
                    string username = jwtToken.Payload["username"]?.ToString();
                    string role = jwtToken.Payload["role"]?.ToString();
                    DateTime? expTime = jwtToken.Payload.Exp;

                    // 验证令牌是否过期
                    if (expTime.HasValue && expTime.Value < DateTime.UtcNow)
                    {
                        // 令牌过期,跳转回登录页
                        Response.Redirect("Login.aspx");
                        return;
                    }

                    // 将用户信息展示到页面
                    lblUserInfo.Text = $"Online ID: {onlineId}<br>Username: {username}<br>Role: {role}";
                }
                catch (Exception)
                {
                    // 令牌无效,跳转回登录页
                    Response.Redirect("Login.aspx");
                }
            }
            else
            {
                // 无有效令牌,跳转回登录页
                Response.Redirect("Login.aspx");
            }
        }
    }
}

4. 关键注意事项

  • 密钥必须保密且足够长:建议使用32位以上的随机字符串,不要硬编码到代码中,可存入Web.config的appSettings节点。
  • 令牌验证增强:上述代码仅解析令牌内容,若需严格验证签名、过期时间等,需使用tokenHandler.ValidateToken方法并配置TokenValidationParameters。
  • 存储方式选择:优先使用HttpOnly Cookie存储令牌以防范XSS攻击,若用前端LocalStorage需额外做XSS防护。
  • 与.NET Core的区别:传统ASP.NET无内置JWT中间件,所有逻辑需手动实现;而.NET Core通过AddJwtBearer等扩展方法快速配置验证逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:35:26