2. Claims 與 Roles 的區別

要點:使用 Claims 可將用戶身份信息緩存于令牌中,每次請求僅需解析 JWT 即可獲取,無需再查 DB,極大提升響應速度。


3. 項目結構概覽

/Interfaces
ITokenService.cs
/Services
TokenService.cs
/DTOs
RegisterResponseDto.cs
/Settings
appsettings.json
/Controllers
AccountController.cs
Program.cs

4. 定義 ITokenService 接口

首先在 Interfaces/ITokenService.cs 中定義令牌生成約定:

public interface ITokenService
{
    string CreateToken(AppUser user);
}

5. 實現 TokenService

Services/TokenService.cs 中實現上述接口:

public class TokenService : ITokenService
{
    private readonly IConfiguration _config;
    private readonly SymmetricSecurityKey _key;

    public TokenService(IConfiguration config)
    {
        _config = config;
        // 5.1 從配置讀取簽名密鑰
        _key = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
    }

    public string CreateToken(AppUser user)
    {
        // 5.2 構造 Claims 列表
        var claims = new List < Claim >
        {
            new Claim(JwtRegisteredClaimNames.Email, user.Email),
            new Claim(JwtRegisteredClaimNames.GivenName, user.UserName)
            // 可根據需求加入更多自定義聲明
        };

        // 5.3 創建簽名憑證與 SecurityTokenDescripto
        var creds = new SigningCredentials(
            _key, SecurityAlgorithms.HmacSha512Signature);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Expires = DateTime.UtcNow.AddHours(1),
            SigningCredentials = creds,
            Issuer = _config["Jwt:Issuer"],
            Audience = _config["Jwt:Audience"]
        };

        // 5.4 生成并序列化 JWT
        var tokenHandler = new JwtSecurityTokenHandler();
        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }
}

5.1 從配置讀取簽名密鑰

// appsettings.json
"Jwt": {
  "Key": "這里填入至少 512 位的隨機字符串",
  "Issuer": "YourApp",
  "Audience": "YourAppUsers"
}

6. 在 Startup/Program 中注冊服務

builder.Services.AddScoped < ITokenService, TokenService > ();
// 同時需配置 Authentication 和 JwtBearer,省略此處

7. 在注冊接口中返回 Token DTO

AccountController 的注冊方法中,使用 DTO 返回用戶名、郵箱及生成的令牌:

[HttpPost("register")]
public async Task < ActionResult < RegisterResponseDto>> Register(RegisterDto dto)
{
    var user = new AppUser { UserName = dto.Username, Email = dto.Email };
    // … 用戶創建邏輯
    var token = _tokenService.CreateToken(user);
    var response = new RegisterResponseDto
    {
        Username = user.UserName,
        Email    = user.Email,
        Token    = token
    };
    return Ok(response);
}

截圖?@15:35–15:44


8. 測試與驗證

  1. 通過 Postman 發起 POST /api/account/register,填寫用戶名、郵箱和密碼;
  2. 接收響應,包含 Token 字段;
  3. Token 粘貼至 jwt.io 等在線工具,驗證 Claims、Issuer、Audience 與簽名均符合預期。

9. 小結與最佳實踐

通過本文示例,你已掌握 ASP.NET Core 自定義 JWT 生成的核心流程,能夠在項目中快速集成高效、安全的令牌認證機制。祝編碼愉快!

原文引自YouTube視頻:https://www.youtube.com/watch?v=lZu9XcZit2Y

上一篇:

EF Core API 高級查詢:使用 IQueryable 與 QueryObject 實現動態過濾

下一篇:

ASP.NET Core Web API GET 請求全攻略|多場景 GET Endpoint 實戰
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費