myhn/Apps/Api/Controllers/AccountsController.cs
2021-01-15 10:10:24 +01:00

96 lines
3.0 KiB
C#

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Threading.Tasks;
using Api.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
namespace Api.Controllers
{
[ApiController]
[Route("api/accounts")]
public class AccountsController : ControllerBase
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signinManager;
private readonly TokenOptions _options;
private readonly IUserClaimsPrincipalFactory<IdentityUser> _factory;
public AccountsController(
UserManager<IdentityUser> userManager
, SignInManager<IdentityUser> signinManager
, TokenOptions options
, IUserClaimsPrincipalFactory<IdentityUser> factory)
{
_userManager = userManager;
_signinManager = signinManager;
_options = options;
_factory = factory;
}
/// <summary>
/// Permet de créer un nouveau compte utilisateur sur la plateforme.
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
public async Task<IActionResult> Register(RegisterViewModel request)
{
var result = await _userManager.CreateAsync(new IdentityUser(request.Username), request.Password);
if (!result.Succeeded)
{
return BadRequest();
}
return NoContent();
}
/// <summary>
/// Permet de récupèrer un jeton pour un utilisateur afin d'effectuer des appels authentifiés.
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost("token")]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(TokenViewModel), StatusCodes.Status200OK)]
public async Task<IActionResult> Login(LoginViewModel request)
{
var user = await _userManager.FindByNameAsync(request.Username);
if (user == null)
{
return BadRequest();
}
var result = await _signinManager.CheckPasswordSignInAsync(user, request.Password, false);
if (!result.Succeeded)
{
return BadRequest();
}
var principal = await _factory.CreateAsync(user);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = (ClaimsIdentity)principal.Identity,
// Subject = new ClaimsIdentity(new Claim[]{
// new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
// new Claim(ClaimTypes.Name, user.UserName),
// }),
Expires = DateTime.UtcNow.AddDays(7),
Issuer = _options.Issuer,
Audience = _options.Audience,
SigningCredentials = new SigningCredentials(_options.Key,
SecurityAlgorithms.HmacSha256Signature),
};
return Ok(new TokenViewModel(user.UserName, new JwtSecurityTokenHandler().CreateEncodedJwt(tokenDescriptor)));
}
}
}