dotnet
7.0
$ dotnet add package Gleeman.JwtGenerator --version 7.0.0
dotnet
8.0
$ dotnet add package Gleeman.JwtGenerator --version 8.0.0
"TokenSetting": {
"SaveToken": , (default = true) // Optional
"ValidateIssuer": ,(default = true) // Optional
"ValidateAudience": , (default = true) // Optional
"ValidateLifetime": , (default = true) // Optional
"Issuer": "",
"Audience": "",
"SigningKey": "", // Required
"AccessExpire": (default = 0),
"RefreshExpire": (default = 0)
}
using Gleeman.JwtGenerator.Configuration;
builder.Services.AddJwtGenerator(builder.Configuration);
app.UseAuthentication();
app.UseAuthorization();
"TokenSetting": {
"SaveToken": true,
"ValidateIssuer": true,
"ValidateAudience": true,
"ValidateLifetime": true,
"Issuer": "http://localhost:5021",
"Audience": "http://localhost:5021",
"SigningKey": "ee98db58bc6847b189f04937b6cb30e3",
"AccessExpire": 1,
"RefreshExpire": 2
builder.Services.AddDbContext<AppDbContext>(opt => opt.UseInMemoryDatabase("TestDb"));
builder.Services.AddJwtGenerator(builder.Configuration);
builder.Services.AddScoped<IUserService, UserService>();
Database.AddUserData(app);
app.UseAuthentication();
app.UseAuthorization();
public interface IUserService
{
Task<LoginResponse> LoginAsync(LoginRequest loginRequest);
}
public class UserService : IUserService
{
private readonly ITokenGenerator _tokenGenerator;
private readonly AppDbContext _dbContext;
public UserService(ITokenGenerator tokenGenerator, AppDbContext dbContext)
{
_tokenGenerator = tokenGenerator;
_dbContext = dbContext;
}
public async Task<LoginResponse> LoginAsync(LoginRequest loginRequest)
{
var user = await _dbContext.Users
.Where(x => x.Email == loginRequest.Email && x.Password == loginRequest.Password)
.Include(x => x.Role)
.SingleOrDefaultAsync();
if (user == null)
{
return new LoginResponseMessage("Email or Password is wrong!") { Success = false };
}
var userParameter = new UserParameter
{
Id = user.Id.ToString(),
Email= user.Email
};
var token = await _tokenGenerator.GenerateAccessAndRefreshTokenAsync(userParameter, ExpireType.Minute, role: new RoleParameter
{
Role = user.Role.RoleName
});
user.Token = token.RefreshToken;
user.TokenExpire = token.RefreshExpire;
_dbContext.Update(user);
await _dbContext.SaveChangesAsync();
return new LoginResponse
{
AccessToken = token.AccessToken,
AccessExpires = token.AccessExpire,
RefreshToken = token.RefreshToken,
RefreshExpires = token.RefreshExpire,
Success = true
};
}
}
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly IUserService _userService;
public AuthController(IUserService userService)
{
_userService = userService;
}
[HttpPost]
public async Task<IActionResult> Login(LoginRequest loginRequest)
{
var result = await _userService.LoginAsync(loginRequest);
if (result.Success)
{
return Ok(new { AccessToken = result.AccessToken, AccessExpire = result.AccessExpires, RefreshToken = result.RefreshToken, RefreshExpires = result.RefreshExpires });
}
return BadRequest(result.Message);
}
}