示例#1
0
        public async Task <IActionResult> OnPostConfirmationAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");

            var subdomain = GetSubdomain(HttpContext.Request.Host.ToString());

            // Get the information about the user from the external login provider
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ErrorMessage = "Error loading external login information during confirmation.";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }

            if (ModelState.IsValid)
            {
                var email     = info.Principal.FindFirst(ClaimTypes.Email).ToString().Split(" ")[1];
                var firstName = Input.FirstName[0].ToString().ToUpper() + Input.FirstName.Substring(1).ToLower();
                var lastName  = Input.LastName[0].ToString().ToUpper() + Input.LastName.Substring(1).ToLower();
                var userName  = firstName + "_" + lastName;
                var countUser = _userManager.Users.Where(c => c.UserName.Contains(userName)).Count();

                if (countUser > 0)
                {
                    userName = userName + countUser;
                }

                var user = new User {
                    UserName = userName, Email = email, FirstName = firstName, LastName = lastName, EmailConfirmed = true
                };
                var result = await _userManager.CreateAsync(user);

                if (result.Succeeded)
                {
                    await _userManager.AddClaimAsync(user, new Claim(subdomain, "User"));

                    result = await _userManager.AddLoginAsync(user, info);

                    if (result.Succeeded)
                    {
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            LoginProvider = info.LoginProvider;
            ReturnUrl     = returnUrl;
            return(Page());
        }
示例#2
0
        public async Task <IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");

            var subdomain = GetSubdomain(HttpContext.Request.Host.ToString());

            if (remoteError != null)
            {
                ErrorMessage = $"Error from external provider: {remoteError}";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ErrorMessage = "Error loading external login information.";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }

            // Sign in the user with this external login provider if the user already has a login.
            var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false, bypassTwoFactor : true);

            if (result.Succeeded)
            {
                _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);

                var email    = info.Principal.FindFirst(ClaimTypes.Email).Value;
                var userFind = await _userManager.FindByEmailAsync(email);

                if (!_userManager.GetUsersForClaimAsync(new Claim("SuperAdmin", "SuperAdmin")).Result
                    .Contains(userFind))
                {
                    if (subdomain != null)
                    {
                        var claimsForSubdomain = _userManager.GetClaimsAsync(userFind).Result.FirstOrDefault(c => c.Type == subdomain);
                        if (claimsForSubdomain == null)
                        {
//                            await _signInManager.SignOutAsync();
//                            errors.Add("domein");
//                            return BadRequest(errors);
                            await _userManager.AddClaimAsync(userFind, new Claim(subdomain, "User"));

                            //TODO toaster melding? "Geregistreerd op een nieuw platform"
                        }
                    }
                }

                return(LocalRedirect(returnUrl));
            }
            if (result.IsLockedOut)
            {
                return(RedirectToPage("./Lockout"));
            }
            else
            {
                // If the user does not have an account, create an account.
                var email     = info.Principal.FindFirst(ClaimTypes.Email).Value;
                var firstName = "";
                var lastName  = "";
                try
                {
                    firstName =
                        info.Principal.FindFirst(ClaimTypes.GivenName).Value[0].ToString().ToUpper() +
                        info.Principal.FindFirst(ClaimTypes.GivenName).Value.Substring(1).ToLower();
                }
                catch (Exception)
                {
                    firstName = info.Principal.Claims.Where(x => x.Type == "display-name").FirstOrDefault().Value.Split(" ")[0][0].ToString().ToUpper() +
                                info.Principal.Claims.Where(x => x.Type == "display-name").FirstOrDefault().Value.Split(" ")[0].Substring(1).ToLower();
                }

                try
                {
                    lastName =
                        info.Principal.FindFirst(ClaimTypes.Surname).Value[0].ToString().ToUpper() +
                        info.Principal.FindFirst(ClaimTypes.Surname).Value.Substring(1).ToLower();
                }
                catch (Exception)
                {
                    lastName = info.Principal.Claims.Where(x => x.Type == "display-name").FirstOrDefault().Value.Split(" ")[1][0].ToString().ToUpper() +
                               info.Principal.Claims.Where(x => x.Type == "display-name").FirstOrDefault().Value.Split(" ")[1].Substring(1).ToLower();
                }

                if (email == null)
                {
                    LoginProvider = info.LoginProvider;
                    ErrorMessage  = "No email registered on your " + LoginProvider + "account";
                    return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
                }

                // Ask firstname and last name if the user does not have an firstname or lastname
                if (firstName == String.Empty | lastName == String.Empty)
                {
                    ReturnUrl     = returnUrl;
                    LoginProvider = info.LoginProvider;
                    if (info.Principal.HasClaim(c => c.Type == ClaimTypes.Name))
                    {
                        Input = new InputModel
                        {
                            FirstName = info.Principal.FindFirst(ClaimTypes.Name).ToString().Split(" ")[1][0].ToString().ToUpper() + info.Principal.FindFirst(ClaimTypes.Name).ToString().Split(" ")[1].Substring(1).ToLower(),
                            LastName  = info.Principal.FindFirst(ClaimTypes.Name).ToString().Split(" ")[2][0].ToString().ToUpper() + info.Principal.FindFirst(ClaimTypes.Name).ToString().Split(" ")[2].Substring(1).ToLower()
                        };
                    }
                    return(Page());
                }

                // If the user does not have an account, then create an account.
                returnUrl = returnUrl ?? Url.Content("~/");

                // Get the information about the user from the external login provider
                var loginInfo = await _signInManager.GetExternalLoginInfoAsync();

                if (loginInfo == null)
                {
                    ErrorMessage = "Error loading external login information during confirmation.";
                    return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
                }

                if (ModelState.IsValid)
                {
                    var userName  = firstName + "_" + lastName;
                    var countUser = _userManager.Users.Where(c => c.UserName.Contains(userName)).Count();

                    if (countUser > 0)
                    {
                        userName = userName + countUser;
                    }

                    var user = new User {
                        UserName = userName, Email = email, FirstName = firstName, LastName = lastName, EmailConfirmed = true
                    };
                    var createUserResult = await _userManager.CreateAsync(user);

                    if (createUserResult.Succeeded)
                    {
                        await _userManager.AddClaimAsync(user, new Claim(subdomain, "User"));

                        createUserResult = await _userManager.AddLoginAsync(user, info);

                        if (createUserResult.Succeeded)
                        {
                            await _signInManager.SignInAsync(user, isPersistent : false);

                            _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
                            return(LocalRedirect(returnUrl));
                        }
                    }
                    foreach (var error in createUserResult.Errors)
                    {
//                        ModelState.AddModelError(string.Empty, error.Description);
                        ErrorMessage = error.Description;
                    }
                }

                LoginProvider = info.LoginProvider;
                ReturnUrl     = returnUrl;
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }
        }