public async Task <ActionResult> Save( [Bind(Include = nameof(UserModel.UserId) + "," + nameof(UserModel.UserName) + "," + nameof(UserModel.Email) + "," + nameof(UserModel.UserType) + "," + nameof(UserModel.Claims) + "," + nameof(UserModel.Permissions) + "," + nameof(UserModel.GroupMembershipRegionIds) + "," + nameof(UserModel.Groups) + "," + nameof(UserModel.SubjectCategoryClaims) + "," + nameof(UserModel.SubjectCategoryClaims) + "." + nameof(SubjectCatagoryClaimValue.BACode) + "," + nameof(UserModel.SubjectCategoryClaims) + "." + nameof(SubjectCatagoryClaimValue.DocType) + "," + nameof(UserModel.SubjectCategoryClaims) + "." + nameof(SubjectCatagoryClaimValue.OrgCode) + "," + nameof(UserModel.SubjectCategoryClaims) + "." + nameof(SubjectCatagoryClaimValue.Regions) )] UserModel m) { AspNetUser u = null; m.UserId = StringHelpers.TrimOrNull(m.UserId); m.UserName = StringHelpers.TrimOrNull(m.UserName); m.Email = StringHelpers.TrimOrNull(m.Email); var users = await DB.AspNetUsers.Where(z => z.UserName == m.UserName || z.Email == m.Email || z.Id == m.UserId).ToListAsync(); bool hasErrors = false; bool userNameError = false; bool emailError = false; foreach (var user in users) { if (user.Id == m.UserId) { u = user; continue; } if (0 == string.Compare(m.UserName, user.UserName, true) && !userNameError && m.UserName != null) { ModelState.AddModelError(nameof(m.UserName), $"Username {m.UserName} already exists, cannot re-add"); hasErrors = true; userNameError = true; } if (0 == string.Compare(m.Email, user.Email, true) && !emailError && m.Email != null) { ModelState.AddModelError(nameof(m.Email), $"Email {m.Email} already exists, cannot re-add"); hasErrors = true; emailError = true; } } if (ModelState.IsValid && !hasErrors) { if (u == null && m.UserId == null) { var res = await UserManager.CreateAsync(new ApplicationUser { UserName = m.UserName, Email = StringHelpers.TrimOrNull(m.Email) }); u = await DB.AspNetUsers.FirstOrDefaultAsync(z => z.UserName == m.UserName); Log.Information("Created new user UserId={UserId} => UserName={UserName}, Email={Email}", u.Id, u.UserName, u.Email); } else if (u == null) { return(HttpNotFound()); } else { Log.Information("Modified existing with UserId={UserId} => OldUserName={OldUserName}, OldEmail={OldEmail}, NewUserName={NewUserName}, NewEmail={NewEmail}", u.Id, u.UserName, u.Email, m.UserName, m.Email); u.Email = m.Email; u.UserName = m.UserName; } var myGroups = await DB.AspNetUsers.Where(PortalHelpers.GrouplikeUserPredicate).Where(g => m.Groups.Contains(g.UserName)).ToListAsync(); foreach (var uu in u.ChildUserUsers.ToList()) { DB.UserUsers.Remove(uu); } m.GroupMembershipRegionIds.ForEach(rid => myGroups.ForEach(g => DB.UserUsers.Add(new UserUser { ParentUser = g, ChildUser = u, RegionId = rid }))); foreach (var c in u.AspNetUserClaims.Where(z => z.ClaimType == ApplicationPermissionClaimValue.ClaimType || z.ClaimType == SubjectCatagoryClaimValue.ClaimType).ToList()) { DB.AspNetUserClaims.Remove(c); } var allRegions = Cacher.FindOrCreateValWithSimpleKey("allRegionsHashSet", () => DB.Regions.Select(z => z.RegionId).ToSet()); foreach (var p in m.Permissions) { DB.AspNetUserClaims.Add(new AspNetUserClaim { ClaimType = ApplicationPermissionClaimValue.ClaimType, UserId = u.Id, AspNetUser = u, ClaimValue = new ApplicationPermissionClaimValue { ApplicationPermissionName = Parse.ParseEnum <ApplicationPermissionNames>(p), Regions = allRegions }.ToXml() }); } var sccDocTypes = HttpContext.Request.Form.GetValues("scc.docType") ?? Empty.StringArray; var sccBaCodes = HttpContext.Request.Form.GetValues("scc.bacode") ?? Empty.StringArray; var sccOrgCodes = HttpContext.Request.Form.GetValues("scc.orgcode") ?? Empty.StringArray; var sccRegions = HttpContext.Request.Form.GetValues("scc.region") ?? Empty.StringArray; m.Claims.Clear(); m.SubjectCategoryClaims = new List <AspnetUserSubjectCategoryClaim>(); for (int z = 0; z < sccDocTypes.Length; ++z) { var sccv = new SubjectCatagoryClaimValue { BACode = sccBaCodes[z], DocType = sccDocTypes[z], OrgCode = sccOrgCodes[z] }; if (null == StringHelpers.TrimOrNull(sccv.DocType)) { continue; } int regionId = Parse.ParseInt32(sccRegions[z]); sccv.Regions = sccv.Regions ?? new HashSet <int>(); sccv.Regions.Add(regionId); DB.AspNetUserClaims.Add(new AspNetUserClaim { ClaimType = SubjectCatagoryClaimValue.ClaimType, UserId = u.Id, AspNetUser = u, ClaimValue = sccv.ToXml() }); var scc = new AspnetUserSubjectCategoryClaim { BACode = sccv.BACode, DocumentType = sccv.DocType, OrgCode = sccv.OrgCode, }; m.SubjectCategoryClaims.Add(scc); m.Claims.Add(scc.ToFriendlyString()); } await DB.SaveChangesAsync(); return(RedirectToIndex()); } await PopulateDetailsViewBag(); if (m.UserId == null) { return(View("Create", m)); } else { return(View("Details", m)); } }
public static List <AspNetUserClaim> GenerateData(int listSize, string withUserId) { var applicationPermission = new ApplicationPermissionClaimValue { Regions = new HashSet <int>() { 1, 4 }, ApplicationPermissionName = ApplicationPermissionNames.ApplicationUser }; var canViewOtherWorkflowsClaimValue = new ApplicationPermissionClaimValue { Regions = new HashSet <int>() { 1, 4 }, ApplicationPermissionName = ApplicationPermissionNames.CanViewOtherWorkflows }; var canViewReviewsClaimValue = new ApplicationPermissionClaimValue { Regions = new HashSet <int>() { 1, 4 }, ApplicationPermissionName = ApplicationPermissionNames.CanViewReviews }; var canManageUsersClaimValue = new ApplicationPermissionClaimValue { Regions = new HashSet <int>() { 1, 4 }, ApplicationPermissionName = ApplicationPermissionNames.ManageUsers }; var canCreateReviews = new ApplicationPermissionClaimValue { Regions = new HashSet <int>() { 1, 4 }, ApplicationPermissionName = ApplicationPermissionNames.CanCreateReviews }; var scClaimValue = new SubjectCatagoryClaimValue { Regions = new HashSet <int>() { 1, 4 }, DocType = "UE", BACode = "F40000", OrgCode = "G1234" }; var claimType = ApplicationPermissionClaimValue.ClaimType; var seralizedCanViewOtherWorkflowsClaimValue = canViewOtherWorkflowsClaimValue.ToXml(); var serializedCanViewReviewsClaimValue = canViewReviewsClaimValue.ToXml(); var serializedCanManageUsersClaimValue = canManageUsersClaimValue.ToXml(); var serializedScClaimValue = scClaimValue.ToXml(); var serializedApplicationPermission = applicationPermission.ToXml(); var serializedCreateReviews = canCreateReviews.ToXml(); var claims = Builder <AspNetUserClaim> .CreateListOfSize(listSize) .TheFirst(4) .With(u => u.UserId = withUserId) .Build() .ToList(); claims[0].ClaimValue = serializedCanViewReviewsClaimValue; claims[0].ClaimType = ApplicationPermissionClaimValue.ClaimType; claims[1].ClaimValue = serializedCanManageUsersClaimValue; claims[1].ClaimType = ApplicationPermissionClaimValue.ClaimType; claims[2].ClaimValue = serializedScClaimValue; claims[2].ClaimType = SubjectCatagoryClaimValue.ClaimType; claims[3].ClaimValue = seralizedCanViewOtherWorkflowsClaimValue; claims[3].ClaimType = ApplicationPermissionClaimValue.ClaimType; return(claims); }