Ejemplo n.º 1
0
        private async Task <DeliverableResponse> CreateUser(string[] args)
        {
            if (args.Length != 5)
            {
                await Out.WriteLineAsync("Please provide 5 arguments, name, username, email, password and groups. For more information see `help`");

                return(DeliverableResponse.Continue);
            }

            var name       = args[0];
            var username   = args[1];
            var email      = args[2];
            var password   = args[3];
            var groupNames = args[4];

            var identity = BackOfficeIdentityUser.CreateNew(username, email, GlobalSettings.DefaultUILanguage);

            identity.Name = name;

            var result = await userManager.CreateAsync(identity);

            if (!result.Succeeded)
            {
                await Out.WriteLineAsync("Error saving the user:"******"\t{error}");
                }

                return(DeliverableResponse.FinishedWithError);
            }

            result = await userManager.AddPasswordAsync(identity.Id, password);

            if (!result.Succeeded)
            {
                await Out.WriteLineAsync("Error saving the user password:"******"\t{error}");
                }

                return(DeliverableResponse.FinishedWithError);
            }

            var user   = userService.GetByEmail(email);
            var groups = userService.GetUserGroupsByAlias(groupNames.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));

            foreach (var group in groups)
            {
                var rg = new ReadOnlyUserGroup(group.Id, group.Name, group.Icon, group.StartContentId, group.StartMediaId, group.Alias, group.AllowedSections, group.Permissions);
                user.AddGroup(rg);
            }
            user.IsApproved = true;
            userService.Save(user);

            return(DeliverableResponse.Continue);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Used for auto linking/creating user accounts for external logins
        /// </summary>
        /// <param name="loginInfo"></param>
        /// <param name="autoLinkOptions"></param>
        /// <returns></returns>
        private async Task <SignInResult> AutoLinkAndSignInExternalAccount(ExternalLoginInfo loginInfo, ExternalSignInAutoLinkOptions?autoLinkOptions)
        {
            // If there are no autolink options then the attempt is failed (user does not exist)
            if (autoLinkOptions == null || !autoLinkOptions.AutoLinkExternalAccount)
            {
                return(SignInResult.Failed);
            }

            var email = loginInfo.Principal.FindFirstValue(ClaimTypes.Email);

            //we are allowing auto-linking/creating of local accounts
            if (email.IsNullOrWhiteSpace())
            {
                return(AutoLinkSignInResult.FailedNoEmail);
            }
            else
            {
                //Now we need to perform the auto-link, so first we need to lookup/create a user with the email address
                var autoLinkUser = await UserManager.FindByEmailAsync(email);

                if (autoLinkUser != null)
                {
                    try
                    {
                        //call the callback if one is assigned
                        autoLinkOptions.OnAutoLinking?.Invoke(autoLinkUser, loginInfo);
                    }
                    catch (Exception ex)
                    {
                        Logger.LogError(ex, "Could not link login provider {LoginProvider}.", loginInfo.LoginProvider);
                        return(AutoLinkSignInResult.FailedException(ex.Message));
                    }

                    var shouldLinkUser = autoLinkOptions.OnExternalLogin == null || autoLinkOptions.OnExternalLogin(autoLinkUser, loginInfo);
                    if (shouldLinkUser)
                    {
                        return(await LinkUser(autoLinkUser, loginInfo));
                    }
                    else
                    {
                        LogFailedExternalLogin(loginInfo, autoLinkUser);
                        return(ExternalLoginSignInResult.NotAllowed);
                    }
                }
                else
                {
                    var name = loginInfo.Principal?.Identity?.Name;
                    if (name.IsNullOrWhiteSpace())
                    {
                        throw new InvalidOperationException("The Name value cannot be null");
                    }

                    autoLinkUser = BackOfficeIdentityUser.CreateNew(_globalSettings, email, email, autoLinkOptions.GetUserAutoLinkCulture(_globalSettings), name);

                    foreach (var userGroup in autoLinkOptions.DefaultUserGroups)
                    {
                        autoLinkUser.AddRole(userGroup);
                    }

                    //call the callback if one is assigned
                    try
                    {
                        autoLinkOptions.OnAutoLinking?.Invoke(autoLinkUser, loginInfo);
                    }
                    catch (Exception ex)
                    {
                        Logger.LogError(ex, "Could not link login provider {LoginProvider}.", loginInfo.LoginProvider);
                        return(AutoLinkSignInResult.FailedException(ex.Message));
                    }

                    var userCreationResult = await _userManager.CreateAsync(autoLinkUser);

                    if (!userCreationResult.Succeeded)
                    {
                        return(AutoLinkSignInResult.FailedCreatingUser(userCreationResult.Errors.Select(x => x.Description).ToList()));
                    }
                    else
                    {
                        var shouldLinkUser = autoLinkOptions.OnExternalLogin == null || autoLinkOptions.OnExternalLogin(autoLinkUser, loginInfo);
                        if (shouldLinkUser)
                        {
                            return(await LinkUser(autoLinkUser, loginInfo));
                        }
                        else
                        {
                            LogFailedExternalLogin(loginInfo, autoLinkUser);
                            return(ExternalLoginSignInResult.NotAllowed);
                        }
                    }
                }
            }
        }