hn-dotnet/Apps/Api/Controllers/AccountsController.cs
2020-12-22 15:01:03 +01:00

69 lines
2.1 KiB
C#

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Threading.Tasks;
using Api.Models;
using HN.Infrastructure.Identity;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
namespace Api.Controllers
{
[ApiController]
[Route("api/[controller]")]
public sealed class AccountsController : ControllerBase
{
private readonly UserManager<User> _usersManager;
private readonly SignInManager<User> _signinManager;
private readonly TokenValidationParameters _tokenParameters;
public AccountsController(UserManager<User> usersManager, SignInManager<User> signinManager, TokenValidationParameters tokenParameters)
{
_usersManager = usersManager;
_signinManager = signinManager;
_tokenParameters = tokenParameters;
}
/// <summary>
/// Récupère un jeton d'accès pour un utilisateur particulier.
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
[HttpPost("login")]
[AllowAnonymous]
public async Task<ActionResult<string>> Login(LoginViewModel command)
{
var user = await _usersManager.FindByNameAsync(command.Username);
if (user == null)
{
return NotFound();
}
var result = await _signinManager.CheckPasswordSignInAsync(user, command.Password, false);
if (!result.Succeeded)
{
return BadRequest();
}
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, command.Username),
}),
Expires = DateTime.UtcNow.AddDays(7),
Issuer = _tokenParameters.ValidIssuer,
Audience = _tokenParameters.ValidAudience,
SigningCredentials = new SigningCredentials(_tokenParameters.IssuerSigningKey, SecurityAlgorithms.HmacSha256Signature)
};
return Ok(new JwtSecurityTokenHandler().CreateEncodedJwt(tokenDescriptor));
}
}
}