在ASP.NET中,使用JWT(JSON Web Token)進行身份驗證時,令牌刷新是一個重要的過程。當用戶的訪問令牌過期時,他們需要獲取一個新的訪問令牌,以便繼續訪問受保護的資源。以下是使用ASP.NET Core和JWT進行令牌刷新的步驟:
首先,確保已經安裝了以下包:
可以使用以下命令安裝:
dotnet add package Microsoft.IdentityModel.Tokens
dotnet add package System.IdentityModel.Tokens.Jwt
在Startup.cs
文件中,配置JWT服務。首先,添加以下代碼以配置JWT驗證:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = true;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")),
ValidateIssuer = false,
ValidateAudience = false
};
});
// 其他服務配置
}
請確保將your_secret_key
替換為一個安全的密鑰。
創建一個名為TokenRefreshController
的新控制器,用于處理令牌刷新請求。在該控制器中,添加以下代碼:
[ApiController]
[Route("api/[controller]")]
public class TokenRefreshController : ControllerBase
{
private readonly IJwtTokenService _jwtTokenService;
public TokenRefreshController(IJwtTokenService jwtTokenService)
{
_jwtTokenService = jwtTokenService;
}
[HttpPost]
public async Task<IActionResult> RefreshToken([FromBody] RefreshTokenRequest request)
{
var token = await _jwtTokenService.RefreshToken(request.RefreshToken);
if (token == null)
{
return Unauthorized();
}
return Ok(new { token });
}
}
創建一個名為RefreshTokenRequest
的模型類,用于接收刷新令牌請求中的數據:
public class RefreshTokenRequest
{
public string RefreshToken { get; set; }
}
創建一個名為IJwtTokenService
的接口,并實現一個名為JwtTokenService
的類,用于處理令牌刷新邏輯。在該類中,添加以下代碼:
public interface IJwtTokenService
{
Task<string> RefreshToken(string refreshToken);
}
public class JwtTokenService : IJwtTokenService
{
private readonly IJwtTokenGenerator _jwtTokenGenerator;
private readonly IConfiguration _configuration;
public JwtTokenService(IJwtTokenGenerator jwtTokenGenerator, IConfiguration configuration)
{
_jwtTokenGenerator = jwtTokenGenerator;
_configuration = configuration;
}
public async Task<string> RefreshToken(string refreshToken)
{
// 在此處實現令牌刷新邏輯,例如驗證刷新令牌并生成新的訪問令牌
// 如果驗證成功,使用_jwtTokenGenerator生成新的訪問令牌
// 如果驗證失敗,返回null
var newAccessToken = _jwtTokenGenerator.GenerateAccessToken();
return newAccessToken;
}
}
創建一個名為IJwtTokenGenerator
的接口,并實現一個名為JwtTokenGenerator
的類,用于生成JWT令牌。在該類中,添加以下代碼:
public interface IJwtTokenGenerator
{
string GenerateAccessToken();
}
public class JwtTokenGenerator : IJwtTokenGenerator
{
private readonly IConfiguration _configuration;
public JwtTokenGenerator(IConfiguration configuration)
{
_configuration = configuration;
}
public string GenerateAccessToken()
{
// 在此處實現訪問令牌的生成邏輯,例如使用_configuration中的密鑰和其他參數
// 返回生成的訪問令牌
}
}
現在,當用戶的訪問令牌過期時,他們可以通過發送包含刷新令牌的POST請求到/api/tokenrefresh
來刷新令牌。如果刷新令牌有效,將返回一個新的訪問令牌。