Exemplo n.º 1
0
        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)
            });
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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);
        }