/
den3011den
/
Tangy
Обзор
Документация
Войти
/
den3011den
/
Tangy
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
TangyWeb_API/Controllers/AccountController.cs
167 строк
6 KB
Денис Богомолов
Доработка API авторизации.
11 апр 2022, 23:07
11 апр 2022, 23:07
78e4a28
Код
Авторство
О чём код?
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Tangy_Common; using Tangy_DataAccess; using Tangy_Models; using TangyWeb_API.Helper; namespace TangyWeb_API.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class AccountController : Controller { private readonly SignInManager<ApplicationUser> _signInManager; private readonly UserManager<ApplicationUser> _userManager; private readonly RoleManager<IdentityRole> _roleManager; private readonly APISettings _aPISettings; public AccountController( UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, RoleManager<IdentityRole> roleManager, IOptions<APISettings> options) { _userManager = userManager; _signInManager = signInManager; _roleManager = roleManager; _aPISettings = options.Value; } [HttpPost] public async Task<IActionResult> SignUp([FromBody] SignUpRequestDTO signUpRequestDTO) { if(signUpRequestDTO == null || !ModelState.IsValid) { return BadRequest(); } var user = new ApplicationUser { UserName = signUpRequestDTO.Email, Email = signUpRequestDTO.Email, Name = signUpRequestDTO.Name, PhoneNumber = signUpRequestDTO.PhoneNumber, EmailConfirmed = true }; var result = await _userManager.CreateAsync(user, signUpRequestDTO.Password); if (!result.Succeeded) { return BadRequest(new SignUpResponseDTO() { IsRegistrationSuccessful = false, Errors=result.Errors.Select(u=>u.Description) }); } var roleResult = await _userManager.AddToRoleAsync(user, SD.Role_Customer); if (!roleResult.Succeeded) { return BadRequest(new SignUpResponseDTO() { IsRegistrationSuccessful = false, Errors = roleResult.Errors.Select(u => u.Description) }); } return StatusCode(201); } [HttpPost] public async Task<IActionResult> SignIn([FromBody] SignInRequestDTO signInRequestDTO) { if (signInRequestDTO == null || !ModelState.IsValid) { return BadRequest(); } var result = await _signInManager.PasswordSignInAsync(signInRequestDTO.UserName, signInRequestDTO.Password, false, false); if (result.Succeeded) { var user = await _userManager.FindByNameAsync(signInRequestDTO.UserName); if(user==null) { return Unauthorized(new SignInResponseDTO() { IsAuthSuccessful = false, ErrorMessage = "Аутентификация не удалась" }); } // всё хорошо и нужно залогиниться var signinCredentials = GetSigningCredentials(); var claims = await GetClaims(user); var tokenOptions = new JwtSecurityToken( issuer:_aPISettings.ValidIssuer, audience:_aPISettings.ValidAudience, claims: claims, expires: DateTime.Now.AddDays(30), signingCredentials: signinCredentials ); var token = new JwtSecurityTokenHandler().WriteToken(tokenOptions); return Ok(new SignInResponseDTO() { IsAuthSuccessful = true, Token = token, UserDTO = new UserDTO() { Name = user.Name, Id = user.Id, Email = user.Email, PhoneNumber = user.PhoneNumber } }); } else { return Unauthorized(new SignInResponseDTO() { IsAuthSuccessful = false, ErrorMessage = "Авторизация не удалась" }); } return StatusCode(201); } private SigningCredentials GetSigningCredentials() { var secret = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_aPISettings.SecretKey)); return new SigningCredentials(secret, SecurityAlgorithms.HmacSha256); } private async Task<List<Claim>> GetClaims(ApplicationUser user) { var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.Email), new Claim(ClaimTypes.Email, user.Email), new Claim("Id", user.Id) }; var roles = await _userManager.GetRolesAsync(await _userManager.FindByEmailAsync(user.Email)); foreach(var role in roles) { claims.Add(new Claim(ClaimTypes.Role, role)); } return claims; } } }