hackernet/Apps/HackerNet.Api/Controllers/AccountsController.cs
2021-12-15 16:05:50 +01:00

78 lines
2.3 KiB
C#

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using HackerNet.Api.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
namespace HackerNet.Api.Controllers;
[ApiController]
[Route("/api/accounts")]
public class AccountsController : ControllerBase
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
private readonly IUserClaimsPrincipalFactory<IdentityUser> _claimsFactory;
private readonly TokenValidation _tokenValidation;
public AccountsController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, IUserClaimsPrincipalFactory<IdentityUser> claimsFactory, TokenValidation tokenValidation)
{
_userManager = userManager;
_signInManager = signInManager;
_claimsFactory = claimsFactory;
_tokenValidation = tokenValidation;
}
[HttpGet("me")]
public ActionResult<string> Me()
{
return User.Identity.Name;
}
[HttpPost]
public async Task<ActionResult> Signup(SignupLoginViewModel cmd)
{
var user = new IdentityUser(cmd.Username);
var result = await _userManager.CreateAsync(user, cmd.Password);
if (!result.Succeeded)
{
return BadRequest();
}
return CreatedAtAction(nameof(Me), null);
}
[HttpPost("token")]
public async Task<ActionResult<string>> Signin(SignupLoginViewModel cmd)
{
var user = await _userManager.FindByNameAsync(cmd.Username);
if (user == null)
{
return BadRequest();
}
var result = await _signInManager.CheckPasswordSignInAsync(user, cmd.Password, false);
if (!result.Succeeded)
{
return BadRequest();
}
var principal = await _claimsFactory.CreateAsync(user);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = (ClaimsIdentity)principal.Identity,
Expires = DateTime.UtcNow.AddDays(7),
Issuer = _tokenValidation.Issuer,
Audience = _tokenValidation.Audience,
SigningCredentials = new SigningCredentials(
new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(_tokenValidation.Key))
, SecurityAlgorithms.HmacSha256Signature)
};
return new JwtSecurityTokenHandler().CreateEncodedJwt(tokenDescriptor);
}
}