initial commit
This commit is contained in:
88
CityInfo.API/Controllers/AuthenticationController.cs
Normal file
88
CityInfo.API/Controllers/AuthenticationController.cs
Normal file
@@ -0,0 +1,88 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using System.IdentityModel.Tokens.Jwt;
|
||||
using System.Security.Claims;
|
||||
|
||||
namespace CityInfo.API.Controllers
|
||||
{
|
||||
[Route("api/authentication")]
|
||||
[ApiController]
|
||||
public class AuthenticationController : ControllerBase
|
||||
{
|
||||
private readonly IConfiguration _configuration;
|
||||
|
||||
public class AuthenticationRequestBody
|
||||
{
|
||||
public string? UserName { get; set; }
|
||||
public string? Password { get; set; }
|
||||
|
||||
}
|
||||
internal class CityInfoUser
|
||||
{
|
||||
public int UserId { get; set; }
|
||||
public string UserName { get; set; }
|
||||
public string FirstName { get; set; }
|
||||
public string LastName { get; set; }
|
||||
public string City { get; set; }
|
||||
public CityInfoUser(
|
||||
int userId, string userName, string firstName, string lastName, string city)
|
||||
{
|
||||
UserId = userId;
|
||||
UserName = userName;
|
||||
FirstName = firstName;
|
||||
LastName = lastName;
|
||||
City = city;
|
||||
}
|
||||
}
|
||||
|
||||
public AuthenticationController(IConfiguration configuration)
|
||||
{
|
||||
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
|
||||
}
|
||||
|
||||
[HttpPost("authenticate")]
|
||||
public ActionResult<string> Authenticate(AuthenticationRequestBody authenticationRequestBody)
|
||||
{
|
||||
var user = ValidateUserCredentials(authenticationRequestBody.UserName, authenticationRequestBody.Password);
|
||||
if (user == null)
|
||||
{
|
||||
return Unauthorized();
|
||||
}
|
||||
|
||||
var securityKey = new SymmetricSecurityKey(Convert.FromBase64String(_configuration["Authentication:SecretForKey"]));
|
||||
var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
|
||||
|
||||
var claimsForToken = new List<Claim>
|
||||
{
|
||||
new Claim("sub", user.UserId.ToString()),
|
||||
new Claim("given_name", user.FirstName),
|
||||
new Claim("family_name", user.LastName),
|
||||
new Claim("city", user.City)
|
||||
};
|
||||
|
||||
var jwtSecurityToken = new JwtSecurityToken(
|
||||
_configuration["Authentication:Issuer"],
|
||||
_configuration["Authentication:Audience"],
|
||||
claimsForToken,
|
||||
DateTime.UtcNow,
|
||||
DateTime.UtcNow.AddHours(1),
|
||||
signingCredentials);
|
||||
|
||||
var tokenToReturn = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
|
||||
|
||||
return Ok(tokenToReturn);
|
||||
}
|
||||
|
||||
private CityInfoUser ValidateUserCredentials(string? userName, string? password)
|
||||
{
|
||||
return new CityInfoUser(
|
||||
1,
|
||||
userName ?? "",
|
||||
"Nathan",
|
||||
"Pire",
|
||||
"Charleroi");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user