魅力程序猿

  • 首页
  • Java
  • Android
  • APP
    • 扑克计分器
    • Video Wallpaper
  • 联系我
  • 关于我
  • 资助
道子
向阳而生
  1. 首页
  2. AI技术
  3. 正文

.NET 8 Web开发入门(七):安全门禁——JWT 身份验证与授权实战

2026年6月4日 11点热度 0人点赞 0条评论

📰 来源: 博客园


大家好,我是码农刚子。

一、前言:给 API 装个“门禁卡”

在前面的文章里,我们的 Todo API 就像一栋没有大门的房子,任何人都可以随意进出(调用接口)。这在企业级应用中是绝对不允许的。

  • 认证:你是谁?(查验身份证)
  • 授权:你能干什么?(查看权限列表)
  • 在前后端分离的架构中,JWT (JSON Web Token) 是目前最流行的认证方案。它就像一张“电子门禁卡”。用户登录成功后,服务器发给他一张卡(Token),以后每次请求都要带着这张卡,服务器只需验证卡的真伪,而不需要每次都去查数据库。

    二、JWT 到底是什么?

    刚子不喜欢背书,你只需要理解三个核心点:

    一个 JWT 就是一个很长的字符串,长得像这样: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuWkp...

    它由三部分组成(用 . 分隔):

  • Header(头):说明这是什么卡,用什么加密算法。
  • Payload(载荷):重点。里面存着用户信息(如用户ID、用户名、角色)。注意:这里的数据只是 Base64 编码,不要存密码!
  • Signature(签名):核心安全层。服务器用只有自己知道的密钥,对前两部分进行签名。黑客如果篡改了 Payload,签名就对不上了,服务器会直接拒绝。
  • 三、实战准备:安装 NuGet 包

    在项目中安装以下 NuGet 包:

    dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
    

    这会引入处理 JWT 验证的核心中间件。

    四、第一步:打造“发卡处”

    用户登录时,我们需要核实账号密码,然后生成 Token 发给他。为了演示方便,我们假设有一个模拟的用户库。

    4.1 定义配置模型和模拟用户

    在 Program.cs 顶部定义模型:

    // 定义用户模型
    public class User
    {
        public string Username { get; set; }
        public string Password { get; set; } // 实际项目中应存储哈希值
        public string Role { get; set; } // 角色:Admin, User
    }
    
    // 模拟数据库用户
    public static class UserStore
    {
        public static List<User> Users = new List<User>
        {
            new User { Username = "admin", Password = "123456", Role = "Admin" },
            new User { Username = "gangzi", Password = "123456", Role = "User" }
        };
    }
    

    这个接口负责“发卡”。

    using System.IdentityModel.Tokens.Jwt;
    using System.Security.Claims;
    using System.Text;
    using Microsoft.IdentityModel.Tokens;
    
    // ... builder 配置 ...
    
    app.MapPost("/login", (User login) =>
    {
        // 1. 验证账号密码
        var user = UserStore.Users.FirstOrDefault(u => u.Username == login.Username && u.Password == login.Password);
        if (user == null)
        {
            return Results.Unauthorized(); // 401 未授权
        }
    
        // 2. 创建 Claims(声明) - 也就是 Payload 里要存的数据
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, user.Username),
            new Claim(ClaimTypes.Role, user.Role), // 存入角色,用于授权
            new Claim("MyCustomClaim", "SomeData") // 也可以存自定义数据
        };
    
        // 3. 生成签名密钥(实际项目中应从 appsettings.json 读取)
        // 密钥至少要 16 个字符
        var secretKey = "This_Is_A_Very_Secret_Key_For_JWT_2026!";
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
        // 4. 生成 Token
        var token = new JwtSecurityToken(
            issuer: "MyTodoApp", // 签发者
            audience: "MyTodoAppUsers", // 接收者
            claims: claims,
            expires: DateTime.Now.AddHours(1), // 过期时间:1小时
            signingCredentials: creds
        );
    
        var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
    
        return Results.Ok(new { Token = tokenString });
    });
    

    刚子敲黑板: 这里的 secretKey 是服务器的“底牌”。绝对不能泄露!如果黑客拿到了这个 Key,他就能伪造任意用户的 Token。在生产环境中,一定要放在 appsettings.json 或环境变量里,并且长度要足够长。

    五、第二步:配置“安检门”

    有了发卡的逻辑,还需要配置中间件,让系统自动验证每个请求带来的 Token。

    5.1 注册认证与授权服务

    在 Program.cs 的 builder.Services 部分添加:

    // 注册认证服务
    builder.Services.AddAuthentication(options =>
    {
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
    // 配置 Token 验证参数
    options.TokenValidationParameters = new TokenValidationParameters
    {
    ValidateIssuer = true,


    🔗 原文链接: 点击阅读原文

    标签: AI 人工智能 技术博客
    最后更新:2026年6月4日

    daozi

    这个人很懒,什么都没留下

    点赞
    < 上一篇

    文章评论

    您需要 登录 之后才可以评论
    搜索
    联系方式

    QQ群:179730949
    QQ群:114559024
    欢迎您加入Android大家庭
    本人QQ:136049925

    赐我一丝安慰
    给我一点鼓励

    COPYRIGHT © 2023 魅力程序猿. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    豫ICP备15000477号