private async Task <JsonWebToken> CreateToken(string userId, string userName, RequestClientType clientType, RefreshToken refreshToken) { Check.NotNullOrEmpty(userId, nameof(userId)); Check.NotNullOrEmpty(userName, nameof(userName)); // New RefreshToken string clientId = refreshToken?.ClientId ?? Guid.NewGuid().ToString(); Claim[] claims = { new Claim(ClaimTypes.NameIdentifier, userId), new Claim(ClaimTypes.Name, userName), new Claim("clientId", clientId), new Claim("clientType", clientType.ToString()) }; var(token, expires) = CreateToken(claims, _jwtOptions, JwtTokenType.RefreshToken, refreshToken); string refreshTokenStr = token; await _provider.ExecuteScopedWorkAsync(async provider => { UserManager <TUser> userManager = provider.GetService <UserManager <TUser> >(); refreshToken = new RefreshToken() { ClientId = clientId, Value = refreshTokenStr, EndUtcTime = expires }; var result = await userManager.SetRefreshToken <TUser, TUserKey>(userId, refreshToken); if (result.Succeeded) { IUnitOfWork unitOfWork = provider.GetUnitOfWork <TUser, TUserKey>(); unitOfWork.Commit(); IEventBus eventBus = _provider.GetService <IEventBus>(); OnlineUserCacheRemoveEventData eventData = new OnlineUserCacheRemoveEventData() { UserNames = new[] { userName } }; eventBus.Publish(eventData); } return(result); }, false); // New AccessToken IAccessClaimsProvider claimsProvider = _provider.GetService <IAccessClaimsProvider>(); claims = await claimsProvider.CreateClaims(userId); List <Claim> claimList = claims.ToList(); claimList.Add(new Claim("clientId", clientId)); claimList.Add(new Claim("clientType", clientType.ToString())); (token, _) = CreateToken(claimList, _jwtOptions, JwtTokenType.AccessToken); return(new JsonWebToken() { AccessToken = token, RefreshToken = refreshTokenStr, RefreshUctExpires = expires.ToJsGetTime().CastTo <long>(0) }); }
/// <summary> /// 设置用户的角色 /// </summary> /// <param name="userId">用户编号</param> /// <param name="roleIds">角色编号集合</param> /// <returns>业务操作结果</returns> public async Task <OperationResult> SetUserRoles(int userId, int[] roleIds) { User user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) { return(new OperationResult(OperationResultType.QueryNull, $"编号为“{userId}”的用户不存在")); } IList <string> roleNames = _roleManager.Roles.Where(m => roleIds.Contains(m.Id)).Select(m => m.Name).ToList(); IList <string> existRoleNames = await _userManager.GetRolesAsync(user); string[] addRoleNames = roleNames.Except(existRoleNames).ToArray(); string[] removeRoleNames = existRoleNames.Except(roleNames).ToArray(); if (!addRoleNames.Union(removeRoleNames).Any()) { return(OperationResult.NoChanged); } try { IdentityResult result = await _userManager.AddToRolesAsync(user, addRoleNames); if (!result.Succeeded) { return(result.ToOperationResult()); } result = await _userManager.RemoveFromRolesAsync(user, removeRoleNames); if (!result.Succeeded) { return(result.ToOperationResult()); } await _userManager.UpdateSecurityStampAsync(user); //更新用户缓存使角色生效 OnlineUserCacheRemoveEventData eventData = new OnlineUserCacheRemoveEventData() { UserNames = new[] { user.UserName } }; _eventBus.Publish(eventData); } catch (InvalidOperationException ex) { return(new OperationResult(OperationResultType.Error, ex.Message)); } if (addRoleNames.Length > 0 && removeRoleNames.Length == 0) { return(new OperationResult(OperationResultType.Success, $"用户“{user.UserName}”添加角色“{addRoleNames.ExpandAndToString()}”操作成功")); } if (addRoleNames.Length == 0 && removeRoleNames.Length > 0) { return(new OperationResult(OperationResultType.Success, $"用户“{user.UserName}”移除角色“{removeRoleNames.ExpandAndToString()}”操作成功")); } return(new OperationResult(OperationResultType.Success, $"用户“{user.UserName}”添加角色“{addRoleNames.ExpandAndToString()}”,移除角色“{removeRoleNames.ExpandAndToString()}”操作成功")); }
/// <summary> /// 更新用户角色信息 /// </summary> /// <param name="dtos">用户角色信息集合</param> /// <returns>业务操作结果</returns> public async Task <OperationResult> UpdateUserRoles(params UserRoleInputDto[] dtos) { List <string> userNames = new List <string>(); OperationResult result = await _userRoleRepository.UpdateAsync(dtos, (dto, entity) => { string userName = _userManager.Users.FirstOrDefault(m => m.Id.Equals(dto.UserId))?.UserName; userNames.AddIfNotNull(userName); return(Task.FromResult(0)); }); if (result.Successed && userNames.Count > 0) { OnlineUserCacheRemoveEventData eventData = new OnlineUserCacheRemoveEventData() { UserNames = userNames.ToArray() }; _eventBus.Publish(eventData); } return(result); }
/// <summary> /// 删除用户角色信息 /// </summary> /// <param name="ids">用户角色信息编号</param> /// <returns>业务操作结果</returns> public async Task <OperationResult> DeleteUserRoles(Guid[] ids) { List <string> userNames = new List <string>(); OperationResult result = await _userRoleRepository.DeleteAsync(ids, (entity) => { string userName = _userRoleRepository.QueryAsNoTracking(m => m.UserId == entity.UserId).Select(m => m.User.UserName).FirstOrDefault(); userNames.AddIfNotNull(userName); return(Task.FromResult(0)); }); if (result.Succeeded && userNames.Count > 0) { OnlineUserCacheRemoveEventData eventData = new OnlineUserCacheRemoveEventData() { UserNames = userNames.ToArray() }; _eventBus.Publish(eventData); } return(result); }
/// <summary> /// 更新用户角色信息 /// </summary> /// <param name="dtos">用户角色信息集合</param> /// <returns>业务操作结果</returns> public async Task <OperationResult> UpdateUserRoles(params UserRoleInputDto[] dtos) { Check.Validate <UserRoleInputDto, Guid>(dtos, nameof(dtos)); List <string> userNames = new List <string>(); OperationResult result = await _userRoleRepository.UpdateAsync(dtos, (dto, entity) => { string userName = _userRoleRepository.QueryAsNoTracking(m => m.UserId == entity.UserId).Select(m => m.User.UserName).FirstOrDefault(); userNames.AddIfNotNull(userName); return(Task.FromResult(0)); }); if (result.Succeeded && userNames.Count > 0) { OnlineUserCacheRemoveEventData eventData = new OnlineUserCacheRemoveEventData() { UserNames = userNames.ToArray() }; _eventBus.Publish(eventData); } return(result); }