溫馨提示×

c# jwtbuilder如何處理過期token

c#
小樊
145
2024-12-12 21:32:06
欄目: 編程語言

在C#中,使用JWTBuilder庫處理過期Token時,首先需要確保已經安裝了System.IdentityModel.Tokens.JwtMicrosoft.IdentityModel.Tokens這兩個包。接下來,你可以通過以下步驟來處理過期Token:

  1. 驗證Token的簽名和有效期。
  2. 如果Token過期,生成一個新的Token。

以下是一個簡單的示例:

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

public class JwtTokenHandler
{
    private readonly string _jwtSecret;
    private readonly string _issuer;
    private readonly string _audience;

    public JwtTokenHandler(string jwtSecret, string issuer, string audience)
    {
        _jwtSecret = jwtSecret;
        _issuer = issuer;
        _audience = audience;
    }

    public string GenerateToken(Claim[] claims, int expirationMinutes = 60)
    {
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSecret));
        var signinCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var jwtToken = new JwtSecurityToken(
            issuer: _issuer,
            audience: _audience,
            claims: claims,
            expires: DateTime.UtcNow.AddMinutes(expirationMinutes),
            signingCredentials: signinCredentials
        );

        return new JwtSecurityTokenHandler().WriteToken(jwtToken);
    }

    public ClaimsPrincipal ValidateToken(string token)
    {
        var validationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = _issuer,
            ValidateAudience = true,
            ValidAudience = _audience,
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSecret)),
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero
        };

        var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
        var principal = jwtSecurityTokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);

        return principal;
    }
}

在這個示例中,我們創建了一個名為JwtTokenHandler的類,它包含了生成和驗證Token的方法。GenerateToken方法用于生成一個新的Token,而ValidateToken方法用于驗證Token是否有效。如果Token過期,你可以在驗證方法中捕獲異常,然后生成一個新的Token。

以下是如何使用這個類的示例:

var jwtTokenHandler = new JwtTokenHandler("your_jwt_secret", "your_issuer", "your_audience");

// 生成一個Token
var claims = new[]
{
    new Claim(ClaimTypes.Name, "John Doe"),
    new Claim(ClaimTypes.Email, "john.doe@example.com")
};
var token = jwtTokenHandler.GenerateToken(claims);

// 驗證Token
try
{
    var principal = jwtTokenHandler.ValidateToken(token);
    Console.WriteLine("Token is valid.");
}
catch (Exception ex)
{
    Console.WriteLine("Token is expired or invalid.");
    // 生成一個新的Token
    token = jwtTokenHandler.GenerateToken(claims);
    Console.WriteLine("New token generated.");
}

這個示例首先生成一個包含用戶名和電子郵件的Token,然后嘗試驗證它。如果Token無效或已過期,將生成一個新的Token。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女