Beispiel #1
0
        private async Task <UserSummaryViewModel> GetUserData(PlantLuvIdentityUser user)
        {
            if (user == null)
            {
                return(null);
            }

            var roles = await _userManager.GetRolesAsync(user);

            if (roles.Count == 0)
            {
                roles.Add("Member");
            }

            // generate the jwt for the local user...
            var jwt = await _jwtFactory.GenerateEncodedToken(user.UserName,
                                                             _jwtFactory.GenerateClaimsIdentity(user.UserName, user.Id.ToString()));

            var userModel = new UserSummaryViewModel
            {
                Id           = Guid.Parse(user.Id),
                Name         = user.Name,
                EmailAddress = user.Email,
                JwtToken     = jwt,
                Roles        = roles.ToArray(),
                AccountId    = 0
            };

            return(userModel);
        }
Beispiel #2
0
        public async Task <IActionResult> Register([FromBody] RegisterViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(new ValidationFailedResult(ModelState));
            }

            var user = new PlantLuvIdentityUser
            {
                Name     = model.Name,
                UserName = model.EmailAddress,
                Email    = model.EmailAddress
            };
            var result = await _userManager.CreateAsync(user, model.Password);

            if (!result.Succeeded)
            {
                return(new ValidationFailedResult(result.Errors.Select(x => x.Description)));
            }

            _logger.LogInformation("User created a new account with password.");
            var identity = await Authenticate(model.EmailAddress, model.Password);

            var userModel = await GetUserData(identity);

            return(Ok(userModel));
        }
Beispiel #3
0
        public async Task <IActionResult> PostMicrosoft([FromBody] MicrosoftAuthViewModel model)
        {
            var verifier = new MicrosoftAuthVerifier <AuthController>(_microsoftAuthSettings, _configuration["HttpHost"] + (model.BaseHref ?? "/"), _logger);
            var profile  = await verifier.AcquireUser(model.AccessToken);

            if (!profile.IsSuccessful)
            {
                _logger.LogWarning("ExternalLoginCallback() unknown error at external login provider, {profile.Error.Message}", profile.Error.Message);
                return(new ValidationFailedResult(profile.Error.Message, StatusCodes.Status400BadRequest));
            }
            var info = new UserLoginInfo("Microsoft", profile.Id, "Microsoft");

            if (info == null || info.ProviderKey == null || info.LoginProvider == null)
            {
                _logger.LogWarning("ExternalLoginCallback() unknown error at external login provider");
                return(new ValidationFailedResult("Unknown error at external login provider", StatusCodes.Status400BadRequest));
            }

            if (string.IsNullOrWhiteSpace(profile.Mail))
            {
                return(new ValidationFailedResult("Email address not available from Login provider, cannot proceed.", StatusCodes.Status403Forbidden));
            }

            // ready to create the local user account (if necessary) and jwt
            var user = await _userManager.FindByEmailAsync(profile.Mail);

            if (user == null)
            {
                var appUser = new PlantLuvIdentityUser
                {
                    Name        = profile.DisplayName,
                    Email       = profile.Mail,
                    UserName    = profile.Mail,
                    PhoneNumber = profile.MobilePhone
                };

                var password = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8) + "#1aA";
                // #1aA ensures all required character types will be in the random password
                var identityResult = await _userManager.CreateAsync(appUser, password);

                if (!identityResult.Succeeded)
                {
                    return(new ValidationFailedResult("Could not create user.", StatusCodes.Status400BadRequest));
                }

                user = await _userManager.FindByEmailAsync(profile.Mail);

                if (user == null)
                {
                    return(new ValidationFailedResult("Failed to create local user account.", StatusCodes.Status400BadRequest));
                }
            }

            var userModel = await GetUserData(user);

            return(Ok(userModel));
        }