예제 #1
0
        public async Task <AuthResult> RegisterAsync(
            string userName,
            string email,
            string password,
            string fingerPrint,
            string longSession)
        {
            var isSignIn = await signInManager.PasswordSignInAsync(userName, password, false, false);

            if (isSignIn.Succeeded)
            {
                throw new ApiError(new ServerException("Пользователь с таким логином уже зарегистрирован"));
            }

            var user = new User()
            {
                UserName = userName,
                Email    = email
            };

            bool isNeedConfirmEmail = emailSenderService.IsNeedConfirm();

            if (isNeedConfirmEmail)
            {
                var isEmailUnique = await userManager.Users.FirstOrDefaultAsync(x => x.Email == email);

                if (isEmailUnique != null)
                {
                    throw new ApiError(new ServerException("Пользователь с таким email уже зарегистрирован"));
                }
            }

            var resultCreate = await userManager.CreateAsync(user, password);

            IdentityRole role;

            if (await userManager.Users.CountAsync() == 1)
            {
                role = await roleManager.Roles.FirstOrDefaultAsync(x => x.Name == "Admin");
            }
            else
            {
                role = await roleManager.Roles.FirstOrDefaultAsync(x => x.Name == "User");
            }

            await userManager.AddToRoleAsync(user, role.Name);

            var registeredUser = await userManager.Users.FirstOrDefaultAsync(x => x.UserName == userName);

            await userProvider.CreateLongSessionAsync(new LongSession()
            {
                UserId      = registeredUser.Id,
                FingerPrint = fingerPrint,
                Value       = longSession
            });

            if (isNeedConfirmEmail)
            {
                string emailToken = await jwtService.GenereteEmailToken(registeredUser);

                await emailSenderService.SendEmailAsync(new AuthMailInfo(emailToken), registeredUser.Email, MailTempleteNames.AuthMailTemplateName);
            }
            List <string> roles = new List <string>()
            {
                role.Name
            };

            return(new AuthResult()
            {
                UserName = userName,
                Roles = roles,
                AccessToken = jwtService.GenereteJwtToken(userName, registeredUser, new List <string>()
                {
                    role.Name
                }),
                RefreshToken = longSession
            });
        }