Building Secure REST APIs with .NET Core
Learn how to build secure and scalable REST APIs using .NET Core with JWT authentication and best practices
By Ajith joseph · · Updated · 5 min read · intermediate
Learn how to create secure and scalable REST APIs using .NET Core with best practices for authentication and authorization.
Setting Up the Project
First, let's create a new .NET Core Web API project:
dotnet new webapi -n SecureApi
cd SecureApi
Implementing JWT Authentication
public class AuthenticationService
{
private readonly IConfiguration _configuration;
private readonly UserManager<ApplicationUser> _userManager;
public AuthenticationService(
IConfiguration configuration,
UserManager<ApplicationUser> userManager)
{
_configuration = configuration;
_userManager = userManager;
}
public async Task<string> GenerateJwtToken(ApplicationUser user)
{
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.Email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.NameIdentifier, user.Id)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Secret"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["JWT:ExpirationInDays"]));
var token = new JwtSecurityToken(
_configuration["JWT:Issuer"],
_configuration["JWT:Audience"],
claims,
expires: expires,
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
Implementing Role-Based Authorization
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _userService;
private readonly ILogger<UsersController> _logger;
public UsersController(IUserService userService, ILogger<UsersController> logger)
{
_userService = userService;
_logger = logger;
}
[HttpGet]
[Authorize(Roles = "Admin")]
public async Task<ActionResult<IEnumerable<UserDto>>> GetUsers()
{
try
{
var users = await _userService.GetUsersAsync();
return Ok(users);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error retrieving users");
return StatusCode(500, "An error occurred while retrieving users");
}
}
}