75 lines
2.4 KiB
C#
75 lines
2.4 KiB
C#
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using SessionZeroBackend.Models;
|
|
|
|
namespace SessionZeroBackend.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("api/[controller]")]
|
|
public class AuthController : ControllerBase
|
|
{
|
|
private readonly UserManager<IdentityUser> _userManager;
|
|
private readonly SignInManager<IdentityUser> _signInManager;
|
|
private readonly IConfiguration _configuration;
|
|
|
|
public AuthController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, IConfiguration configuration)
|
|
{
|
|
_userManager = userManager;
|
|
_signInManager = signInManager;
|
|
_configuration = configuration;
|
|
}
|
|
|
|
[HttpPost("register")]
|
|
public async Task<IActionResult> Register([FromBody] RegisterModel model)
|
|
{
|
|
var user = new IdentityUser { UserName = model.Username, Email = model.Email };
|
|
var result = await _userManager.CreateAsync(user, model.Password);
|
|
|
|
if (result.Succeeded)
|
|
{
|
|
return Ok(new { Message = "User registered successfully" });
|
|
}
|
|
|
|
return BadRequest(result.Errors);
|
|
}
|
|
|
|
[HttpPost("login")]
|
|
public async Task<IActionResult> Login([FromBody] LoginModel model)
|
|
{
|
|
var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, false, false);
|
|
|
|
if (result.Succeeded)
|
|
{
|
|
var user = await _userManager.FindByNameAsync(model.Username);
|
|
var token = GenerateJwtToken(user);
|
|
return Ok(new { Token = token });
|
|
}
|
|
|
|
return Unauthorized();
|
|
}
|
|
|
|
private string GenerateJwtToken(IdentityUser user)
|
|
{
|
|
var claims = new[]
|
|
{
|
|
new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
|
|
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
|
|
};
|
|
|
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
|
|
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
|
|
|
var token = new JwtSecurityToken(
|
|
issuer: _configuration["Jwt:Issuer"],
|
|
audience: _configuration["Jwt:Audience"],
|
|
claims: claims,
|
|
expires: DateTime.Now.AddMinutes(30),
|
|
signingCredentials: creds);
|
|
|
|
return new JwtSecurityTokenHandler().WriteToken(token);
|
|
}
|
|
} |