دلوقتي محتاجين نعملهم Refactor عشان لو حد جه يعمل Login او Register نرجعله الـ Token
نروح على الـ AccountController
نعمل Inject ل Object من Class الـ AuthService
public class AccountController : BaseApiController
{
private readonly UserManager<AppUser> _userManager;
private readonly SignInManager<AppUser> _signInManager;
private readonly IAuthService _authService;
public AccountController(
UserManager<AppUser> userManager,
SignInManager<AppUser> signInManager,
IAuthService authService)
{
_userManager = userManager;
_signInManager = signInManager;
_authService = authService;
}
}ونروح في الـ Project API ونضيف في الـ Main
ممكن نفصل الجزء الخاص بالـ Security Module
هروح على الـ Extensions ونعمل Class اسمه IdentityServicesExtension وهنعمل جواها Extension Method
public static class IdentityServicesExtension
{
public static IServiceCollection AddIdentityServices(this IServiceCollection services)
{
services.AddScoped(typeof(IAuthService), typeof(AuthService))
services.AddIdentity<AppUser, IdentityRole().AddEntityFrameworkStores<AppIdentityDbContext>();
return services;
}
}
// Main
builder.Services.AddIdentityServices();نبدأ نستخدمه بقا عشان نعمل Generate للـ Token
[HttpPost("login")] // POST: /api/account/login
public async Task<ActionResult<UserDto>> Login(LoginDto model)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if(user == null)
return Unauthorized(new ApiResponse(401));
var result = await _signInManager.CheckPasswordSignInAsync(user, model.Password, false);
if (!result.Succeeded)
return Unauthorized(new ApiResponse(401));
return Ok(new UserDto
{
DisplayName = user.DisplayName,
Email = user.Email,
Token = await _authService.CreateTokenAsync(user, _userManager)
});
}
[HttpPost("register")] // POST: /api/account/register
public async Task<ActionResult<UserDto>> Register(RegisterDto model)
{
var user = new AppUser
{
DisplayName = model.DisplayName,
Email = model.Email,
UserName = model.Email.Split("@")[0],
PhoneNumber = model.PhoneNumber
};
var result = await _userManager.CreateAsync(user, model.Password);
if(!result.Succeeded)
return BadRequest(new ApiResponse(400));
return Ok(new UserDto
{
DisplayName = user.DisplayName,
Email = user.Email,
Token = await _authService.CreateTokenAsync(user, _userManager)
});
}