Files
Complex/Complex.EndPoint/Controllers/AccountController.cs
2026-06-02 20:48:16 +03:30

156 lines
5.5 KiB
C#

using Complex.Application.PersonService;
using Complex.Application.Services.Utility;
using Complex.Application.Utility;
using Complex.Common.Dto;
using Complex.Domain.Entities;
using Complex.EndPoint.Utility;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace Complex.EndPoint.Controllers
{
[ApiVersion("1")]
[Route("api/v{version:apiVersion}/[controller]")]
//[Route("[controller]")]
[ApiController]
public class AccountController : Controller
{
private readonly IConfiguration _configuration;
private readonly ISiteAccountlService _SiteAccountlService;
private readonly IUserTokenService _userTokenService;
private readonly ISendUserMessage _sendUserMessage;
public AccountController(IConfiguration configuration
, ISiteAccountlService siteAccountlService, IUserTokenService userTokenRepository,
ISendUserMessage sendUserMessage)
{
this._configuration = configuration;
this._SiteAccountlService = siteAccountlService;
this._userTokenService = userTokenRepository;
this._sendUserMessage = sendUserMessage;
}
[HttpPost]
public IActionResult Post(string PhoneNumber, string SmsCode)
{
try
{
var loginResult = _SiteAccountlService.Login(PhoneNumber, SmsCode);
if (loginResult.IsSuccess == false)
{
return Ok(new LoginResultDto()
{
IsSuccess = false,
Message = loginResult.Message
});
}
var token = CreateToken(loginResult.Person);
return Ok(new LoginResultDto()
{
IsSuccess = true,
Data = token,
});
}
catch (Exception ex)
{
if (ex.InnerException != null)
ex = ex.InnerException;
return Ok(new LoginResultDto
{
IsSuccess = false,
Message = ex.Message + "----" + ex.StackTrace
});
}
}
[HttpPost]
[Route("RefreshToken")]
public IActionResult RefreshToken(string Refreshtoken)
{
var usertoken = _userTokenService.FindRefreshToken(Refreshtoken);
if (usertoken == null)
{
return Unauthorized();
}
if (usertoken.RefreshTokenExp < DateTime.Now)
{
return Unauthorized("Token Expire");
}
var token = CreateToken(usertoken.Person);
_userTokenService.DeleteToken(Refreshtoken);
return Ok(token);
}
[Route("GetSmsCode")]
[HttpGet]
public ResultDto GetSmsCode(string PhoneNumber)
{
var smsCode = _SiteAccountlService.GetCode(PhoneNumber);
//_sendUserMessage.SendPattern("z3rx7fywigv5tdb", PhoneNumber, new { code = smsCode });
//return new ResultDto { IsSuccess = true, Message = "پیامک ارسال شد" };
return new ResultDto { IsSuccess = true, Message = smsCode };
}
[Authorize]
[HttpGet]
[Route("Logout")]
public IActionResult Logout()
{
var user = User.Claims.First(p => p.Type == "UserId").Value;
_SiteAccountlService.Logout(user);
return Ok();
}
private LoginDataDto CreateToken(Person user)
{
//SecurityHelper securityHelper = new SecurityHelper();
var claims = new List<Claim>
{
new Claim ("UserId", user.Id.SimpleCodeString()),
new Claim ("Name", user.FirstName.SimpleCodeString()),
new Claim ("Family", user.LastName.SimpleCodeString()),
};
string key = _configuration["JWtConfig:Key"];
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
var credentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
var tokenexp = DateTime.Now.AddDays(30);//.AddMinutes(int.Parse(_configuration["JWtConfig:expires"]));
var token = new JwtSecurityToken(
issuer: _configuration["JWtConfig:issuer"],
audience: _configuration["JWtConfig:audience"],
expires: tokenexp,
notBefore: DateTime.Now,
claims: claims,
signingCredentials: credentials
);
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
var refreshToken = Guid.NewGuid();
_userTokenService.SaveToken(new UserToken()
{
MobileModel = "",
TokenExp = tokenexp,
TokenHash = jwtToken, //securityHelper.Getsha256Hash(jwtToken),
Person = user,
RefreshToken = refreshToken.ToString(),//securityHelper.Getsha256Hash(refreshToken.ToString()),
RefreshTokenExp = DateTime.Now.AddDays(60)
});
return new LoginDataDto()
{
Token = jwtToken,
RefreshToken = refreshToken.ToString()
};
}
}
}