Esempio n. 1
0
        /// <summary>
        /// 将种子数据初始化到数据库
        /// </summary>
        protected override void SyncToDatabase(Role[] entities, IServiceProvider provider)
        {
            if (entities.Length == 0)
            {
                return;
            }
            RoleManager <Role> roleManager = provider.GetService <RoleManager <Role> >();

            foreach (Role role in entities)
            {
                if (roleManager.Roles.Any(ExistingExpression(role)))
                {
                    continue;
                }
                IdentityResult result = roleManager.CreateAsync(role).Result;
                if (!result.Succeeded)
                {
                    throw new OsharpException($"进行角色种子数据“{role.Name}”同步时出错:{result.ErrorMessage()}");
                }
            }
        }
        public async Task <ActionResult> ResetPassword([FromBody] ResetPasswordVM model)
        {
            // This is called when the user clicks "forgot my password", and then submits an email address
            if (!ModelState.IsValid)
            {
                return(BadRequest("There is something wrong with the request payload")); // TODO: Return friendlier validation errors
            }

            try
            {
                var user = await _userManager.FindByIdAsync(model.UserId);

                if (user == null)
                {
                    // This is only possible if the user somehow changes the password reset confirmation link before clicking
                    return(BadRequest("The supplied user id could not be found"));
                }

                // Reset the password by utilizing the injected user manager
                IdentityResult result = await _userManager.ResetPasswordAsync(user, model.PasswordResetToken, model.NewPassword);

                if (!result.Succeeded)
                {
                    return(BadRequest(result.ErrorMessage("Could not reset password")));
                }
                else
                {
                    // If the password reset succeeds, automatically log the user in
                    var tokenResponse = CreateJwtToken(user.Email);
                    return(Created("", tokenResponse));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.StackTrace);
                return(BadRequest(ex.Message));
            }
        }
 /// <summary>
 /// 将种子数据初始化到数据库
 /// </summary>
 /// <param name="entities"></param>
 protected override void SyncToDatabase(Role[] entities)
 {
     if (entities?.Length > 0)
     {
         _rootProvider.BeginUnitOfWorkTransaction(provider =>
         {
             RoleManager <Role> roleManager = provider.GetService <RoleManager <Role> >();
             foreach (Role role in entities)
             {
                 if (roleManager.Roles.Any(ExistingExpression(role)))
                 {
                     continue;
                 }
                 IdentityResult result = roleManager.CreateAsync(role).Result;
                 if (!result.Succeeded)
                 {
                     throw new OsharpException($"进行角色种子数据“{role.Name}”同步时出错:{result.ErrorMessage()}");
                 }
             }
         },
                                                  true);
     }
 }
        public async Task <ActionResult> ChangePassword([FromBody] ChangePasswordVM model)
        {
            // This is called when the user presses the confirm email link that is sent to his/her inbox
            if (!ModelState.IsValid)
            {
                return(BadRequest("There is something wrong with the request payload")); // TODO: Return friendlier validation errors
            }

            try
            {
                // Get the user
                var username = User.UserName();
                var user     = await _userManager.FindByNameAsync(username);

                if (user == null)
                {
                    // This is only possible if the admin deletes the user while the user is logged in
                    return(BadRequest("Your account was deleted"));
                }

                // Rely on the injected user manager to validate the token and confirm the user's email
                IdentityResult result = await _userManager.ChangePasswordAsync(user, model.CurrentPassword, model.NewPassword);

                if (!result.Succeeded)
                {
                    return(BadRequest(result.ErrorMessage("Could not change password")));
                }

                // All good
                return(Ok());
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.StackTrace);
                return(BadRequest(ex.Message));
            }
        }
        public async Task <ActionResult> ConfirmEmail([FromBody] ConfirmEmailVM model)
        {
            // This is called when the user presses the confirm email link that is sent to his/her inbox
            if (!ModelState.IsValid)
            {
                return(BadRequest("There is something wrong with the request payload")); // TODO: Return friendlier validation errors
            }

            try
            {
                // Get the user
                var user = await _userManager.FindByIdAsync(model.UserId);

                if (user == null)
                {
                    // This is only possible if the user changes the email confirmation link before clicking
                    return(BadRequest("The supplied user id could not be found"));
                }

                // Rely on the injected user manager to validate the token and confirm the user's email
                IdentityResult result = await _userManager.ConfirmEmailAsync(user, model.EmailConfirmationToken);

                if (!result.Succeeded)
                {
                    return(BadRequest(result.ErrorMessage("Could not confirm email")));
                }

                // All good
                return(Ok());
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.StackTrace);
                return(BadRequest(ex.Message));
            }
        }
        public async Task <ActionResult <UserVM> > Post(UserVM model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest("There is something wrong with the request payload")); // TODO: Return friendlier validation errors
            }

            try
            {
                if (string.IsNullOrWhiteSpace(model.Id)) // Insert logic
                {
                    User user = new User
                    {
                        FullName = model.FullName,
                        UserName = model.Email,
                        Email    = model.Email,
                        Role     = model.Role
                    };

                    // Create the user object in the identity store
                    IdentityResult result = await _userManager.CreateAsync(user);

                    if (!result.Succeeded)
                    {
                        return(BadRequest(result.ErrorMessage("Could not create user")));
                    }

                    // Rely on the injected user manager to generate the email-confirmation and password-reset tokens
                    string emailConfirmationToken = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    string passwordResetToken = await _userManager.GeneratePasswordResetTokenAsync(user);

                    // In a bigger app, the API should not know where the SPA lives
                    // But this is fine and convenient for now
                    string uri = $"https://{Request.Host}/{Request.PathBase}confirm-email";

                    uri = QueryHelpers.AddQueryString(uri, "userId", user.Id);
                    uri = QueryHelpers.AddQueryString(uri, "emailConfirmationToken", emailConfirmationToken);
                    uri = QueryHelpers.AddQueryString(uri, "passwordResetToken", passwordResetToken);
                    string currentUser = User.UserName();

                    // Prepare the email content
                    string htmlEmail = Util.Util.BSharpEmailTemplate(
                        message: $"{currentUser} is inviting you to join! Let's start by confirming your email:",
                        hrefToAction: uri,
                        hrefLabel: "Confirm My Email");

                    // Send the email using injected sender
                    await _emailSender.SendEmail(
                        destinationEmailAddress : model.Email,
                        subject : "Invitation to join BSharp ERP",
                        htmlEmail : htmlEmail);


                    // Map the newly created User object, and return that
                    var resultModel = _mapper.Map <User, UserVM>(user);
                    var resourceUrl = $"{Url.Action(nameof(Get), nameof(UsersController))}/{resultModel.Id}"; // TODO fix this bug

                    return(Created(resourceUrl, resultModel));
                }
                else  // Update logic
                {
                    User user = await _userManager.FindByIdAsync(model.Id);

                    if (user == null)
                    {
                        return(NotFound($"Could not find a user with an Id of '{model.Id}'"));
                    }

                    // Here we ensure that there is at least one administrator in the system at all times
                    if (model.Email == User.UserName() && model.Role != Roles.Administrator)
                    {
                        return(BadRequest("You cannot remove the administrator role from yourself"));
                    }

                    // Update the updatable properties and ignore the rest
                    user.FullName = model.FullName;
                    user.Role     = model.Role;


                    // Update in identity store using the userManager
                    IdentityResult result = await _userManager.UpdateAsync(user);

                    if (!result.Succeeded)
                    {
                        return(BadRequest(result.ErrorMessage("Could not update user")));
                    }

                    // Finally return the result
                    var resultModel = _mapper.Map <User, UserVM>(user);
                    return(Ok(resultModel));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.StackTrace);
                return(BadRequest(ex.Message));
            }
        }
        /// <summary>
        /// 将种子数据初始化到数据库
        /// </summary>
        /// <param name="entities"></param>
        protected override void SyncToDatabase(UserRole[] entities)
        {
            _rootProvider.BeginUnitOfWorkTransaction(provider =>
            {
                UserManager <User> userManager = provider.GetService <UserManager <User> >();
                RoleManager <Role> roleManager = provider.GetService <RoleManager <Role> >();

                User user = userManager.Users.OrderBy(p => p.CreatedTime).FirstOrDefault();

                List <string> roles = roleManager.Roles.Select(p => p.Name).ToList();

                if (user != null && roles.Any())
                {
                    var userRoles = userManager.GetRolesAsync(user).Result;
                    var newRoles  = roles.Except(userRoles).ToList();
                    if (newRoles.Any())
                    {
                        IdentityResult result = userManager.AddToRolesAsync(user, newRoles).Result;

                        if (!result.Succeeded)
                        {
                            throw new HybridException($"进行用户角色种子数据“{user.UserName}”同步时出错:{result.ErrorMessage()}");
                        }
                    }
                }
            },
                                                     true);
        }
Esempio n. 8
0
 /// <summary>
 /// 将种子数据初始化到数据库
 /// </summary>
 /// <param name="entities"></param>
 protected override void SyncToDatabase(User[] entities)
 {
     if (entities.Any())
     {
         _rootProvider.BeginUnitOfWorkTransaction(provider =>
         {
             UserManager <User> userManager = provider.GetService <UserManager <User> >();
             foreach (User user in entities)
             {
                 if (userManager.Users.Any(ExistingExpression(user)))
                 {
                     continue;
                 }
                 IdentityResult result = userManager.CreateAsync(user).Result;
                 if (!result.Succeeded)
                 {
                     throw new HybridException($"进行用户种子数据“{user.UserName}”同步时出错:{result.ErrorMessage()}");
                 }
             }
         },
                                                  true);
     }
 }