using System.Security.Claims; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Roles; using gehGassi.Domain.Users; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Options; namespace gehGassi.Web.Auth { public class CustomClaimsPrincipalFactory : UserClaimsPrincipalFactory { private readonly ICustomerService _customerService; private readonly IAppUserService _appUserService; public CustomClaimsPrincipalFactory(UserManager userManager, RoleManager roleManager, IOptions optionsAccessor, ICustomerService customerService, IAppUserService appUserService) : base(userManager, roleManager, optionsAccessor) { _customerService = customerService; _appUserService = appUserService; } public override async Task CreateAsync(ApplicationUser user) { var principal = await base.CreateAsync(user); //var roles = await UserManager.GetRolesAsync(user); var customerName = ""; var customerUniqueId = ""; var selectedCustomerId = ""; var selectedCustomerUniqueId = ""; var selectedCustomerName = ""; var customer = await _customerService.GetAsync(user.CustomerId); if (customer != null) { customerName = customer.Name; customerUniqueId = customer.UniqueId.ToString(); selectedCustomerId = customer.Id.ToString(); selectedCustomerUniqueId = customer.UniqueId.ToString(); selectedCustomerName = customer.Name; } if (user.Settings.SelectedCustomerId.HasValue) { if (await UserManager.IsInRoleAsync(user, "Administrator") || await UserManager.IsInRoleAsync(user, "PowerUser")) { var selectedCustomer = await _customerService.GetAsync(user.Settings.SelectedCustomerId.Value); if (selectedCustomer != null) { selectedCustomerId = selectedCustomer.Id.ToString(); selectedCustomerUniqueId = selectedCustomer.UniqueId.ToString(); selectedCustomerName = selectedCustomer.Name; } } } var appUserName = ""; var selectedAppUserId = ""; var selectedAppUserName = ""; var appUser = await _appUserService.GetAsync(user.AppUserId); if (appUser != null) { appUserName = $"{appUser.FirstName} {appUser.LastName}"; selectedAppUserId = appUser.Id ?? ""; selectedAppUserName = $"{appUser.FirstName} {appUser.LastName}"; } if (!string.IsNullOrWhiteSpace(user.Settings.SelectedAppUserId)) { if (await UserManager.IsInRoleAsync(user, "Administrator") || await UserManager.IsInRoleAsync(user, "PowerUser")) { var selectedAppUser = await _appUserService.GetAsync(user.Settings.SelectedAppUserId); if (selectedAppUser != null) { selectedAppUserId = selectedAppUser.Id ?? ""; selectedAppUserName = $"{selectedAppUser.FirstName} {selectedAppUser.LastName}"; } } } // Add your claims here ((ClaimsIdentity)principal.Identity). AddClaims(new[] { new Claim(ClaimTypes.Name,user.LastName.ToString()), new Claim(ClaimTypes.GivenName,user.FirstName.ToString()), new Claim(ClaimConstants.PackedPermissionClaimType,user.Permissions.ToString()), new Claim(ClaimConstants.CustomerIdClaimType, user.CustomerId.ToString()), new Claim(ClaimConstants.CustomerUniqueIdClaimType, customerUniqueId), new Claim(ClaimConstants.CustomerNameClaimType, customerName), new Claim(ClaimConstants.SelectedCustomerIdClaimType, selectedCustomerId), new Claim(ClaimConstants.SelectedCustomerUniqueIdClaimType, selectedCustomerUniqueId), new Claim(ClaimConstants.SelectedCustomerNameClaimType, selectedCustomerName), new Claim(ClaimConstants.AppUserIdClaimType, user.AppUserId ?? ""), new Claim(ClaimConstants.AppUserNameClaimType, appUserName), new Claim(ClaimConstants.SelectedAppUserIdClaimType, selectedAppUserId ?? ""), new Claim(ClaimConstants.SelectedAppUserNameClaimType, selectedAppUserName), }); return principal; } } }