public async Task <BridgeLoginResponseModel> Login(BridgeLoginRequestModel model)
        {
            var request = model as FacebookWithPhoneRequestModel;
            var profile = await _facebookService.GetProfile(request.Token);

            var userWithFacebook = _unitOfWork.Repository <ApplicationUser>().Get(x => x.FacebookId == profile.Id)
                                   .Include(x => x.VerificationTokens)
                                   .FirstOrDefault();

            // If there is such user in DB - just return
            if (userWithFacebook != null)
            {
                var loginResponse = await _jwtService.BuildLoginResponse(userWithFacebook);

                return(loginResponse);
            }
            else if (userWithFacebook == null && request.PhoneNumber != null)
            {
                // Check if there is such user in DB, if so - add to it facebook id
                var existingUser = _unitOfWork.Repository <ApplicationUser>().Find(x => x.PhoneNumber == request.PhoneNumber);

                if (existingUser != null)
                {
                    existingUser.FacebookId = profile.Id;

                    _unitOfWork.Repository <ApplicationUser>().Update(existingUser);
                    _unitOfWork.SaveChanges();

                    var loginResponse = await _jwtService.BuildLoginResponse(existingUser);

                    return(loginResponse);
                }
                else
                {
                    // In other case create VerificationCode with user data and send core to user
                    try
                    {
                        var data = JsonConvert.SerializeObject(new RegisterWithFacebookUsingPhoneInternalModel
                        {
                            PhoneNumber = request.PhoneNumber,
                            FacebookId  = profile.Id
                        }, new JsonSerializerSettings {
                            Formatting = Formatting.Indented
                        });

                        await _smsService.SendVerificationCodeAsync(request.PhoneNumber, VerificationCodeType.ConfirmFacebook, data);
                    }
                    catch
                    {
                        throw new CustomException(HttpStatusCode.BadRequest, "phoneNumber", "Error while sending message");
                    }

                    throw new CustomException(HttpStatusCode.NoContent, "phoneNumber", "Verification code sent");
                }
            }
            else
            {
                throw new CustomException(HttpStatusCode.BadRequest, "token", "There is no user with such facebook id");
            }
        }
        public async Task <LoginResponseModel> ConfirmEmail(ConfirmEmailRequestModel model)
        {
            var user = _unitOfWork.Repository <ApplicationUser>().Find(x => x.Email == model.Email);

            var token = HttpUtility.UrlDecode(model.Token).Replace(" ", "+");

            if (user == null)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "email", "Email is invalid");
            }

            if (user.EmailConfirmed)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "token", "The email address has been already verified");
            }

            // Confirm email
            var confirmResult = await _userManager.ConfirmEmailAsync(user, token);

            if (!confirmResult.Succeeded)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "token", "The verification link is not active");
            }

            return(await _jwtService.BuildLoginResponse(user));
        }
Exemplo n.º 3
0
        public async Task <BridgeLoginResponseModel> Login(BridgeLoginRequestModel model)
        {
            var request = model as LoginRequestModel;
            var user    = _unitOfWork.Repository <ApplicationUser>().Get(x => x.Email == request.Email)
                          .Include(x => x.UserRoles)
                          .ThenInclude(x => x.Role)
                          .FirstOrDefault();

            if (user == null || !await _userManager.CheckPasswordAsync(user, request.Password) || !user.UserRoles.Any(x => x.Role.Name == Role.User))
            {
                throw new CustomException(HttpStatusCode.BadRequest, "credentials", "Invalid credentials");
            }

            if (!string.IsNullOrEmpty(request.Email) && !user.EmailConfirmed)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "email", "Email is not confirmed");
            }

            if (user.IsDeleted)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", "Your account was deleted by admin, to know more please contact administration.");
            }

            if (!user.IsActive)
            {
                throw new CustomException(HttpStatusCode.MethodNotAllowed, "general", "Your account was blocked. For more information please email to following address: ");
            }

            return(await _jwtService.BuildLoginResponse(user, request.AccessTokenLifetime));
        }
        public async Task <BridgeLoginResponseModel> Login(BridgeLoginRequestModel model)
        {
            var request = model as LoginWithPhoneRequestModel;
            var user    = _unitOfWork.Repository <ApplicationUser>().Find(x => x.PhoneNumber == request.PhoneNumber);

            if (user == null || !await _userManager.CheckPasswordAsync(user, request.Password))
            {
                throw new CustomException(HttpStatusCode.BadRequest, "credentials", "Invalid credentials");
            }

            if (!user.PhoneNumberConfirmed)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "phoneNumber", "PhoneNumber is not confirmed");
            }

            if (user.IsDeleted)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", "Your account was deleted by admin, to know more please contact administration.");
            }

            if (!user.IsActive)
            {
                throw new CustomException(HttpStatusCode.MethodNotAllowed, "general", "Your account was blocked. For more information please email to following address: ");
            }

            return(await _jwtService.BuildLoginResponse(user, request.AccessTokenLifetime));
        }
        public async Task <BridgeLoginResponseModel> Login(BridgeLoginRequestModel model)
        {
            var request = model as AdminLoginRequestModel;
            var user    = _unitOfWork.Repository <ApplicationUser>().Get(x => x.Email == request.Email)
                          .TagWith(nameof(BridgeAdminImplementation) + "_GetAdmin")
                          .Include(x => x.UserRoles)
                          .ThenInclude(x => x.Role)
                          .FirstOrDefault();

            if (user == null || !await _userManager.CheckPasswordAsync(user, request.Password) || !user.UserRoles.Any(x => x.Role.Name == Role.Admin || x.Role.Name == Role.SuperAdmin))
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", "Invalid credentials");
            }

            return(await _jwtService.BuildLoginResponse(user, request.AccessTokenLifetime));
        }
Exemplo n.º 6
0
        public async Task <LoginResponseModel> ConfirmFacebookRegistration(ConfirmPhoneRequestModel model)
        {
            var code = _unitOfWork.Repository <VerificationToken>()
                       .Find(x => !x.IsUsed && x.IsValid && x.Type == VerificationCodeType.ConfirmFacebook && x.TokenHash == _hashUtility.GetHash(model.Code));

            if (code == null)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "code", "SMS code is not valid. Add correct code or re-send it");
            }

            // Parse and create user
            var userData = JsonConvert.DeserializeObject <RegisterWithFacebookUsingPhoneInternalModel>(code.Data);

            var user = CreateUserWithPhone(userData);

            var result = await _userManager.CreateAsync(user);

            if (!result.Succeeded)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
            }

            result = await _userManager.AddToRoleAsync(user, Role.User);

            if (!result.Succeeded)
            {
                throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
            }

            code.IsUsed = true;

            _unitOfWork.Repository <VerificationToken>().Update(code);
            _unitOfWork.SaveChanges();

            var loginResponse = await _jwtService.BuildLoginResponse(user);

            return(loginResponse);
        }
        public async Task <BridgeLoginResponseModel> Login(BridgeLoginRequestModel model)
        {
            var request = model as FacebookWithEmailRequestModel;
            var profile = await _facebookService.GetProfile(request.Token);

            var userWithFacebook = _unitOfWork.Repository <ApplicationUser>().Get(x => x.FacebookId == profile.Id)
                                   .Include(x => x.VerificationTokens)
                                   .FirstOrDefault();

            var email = profile?.Email ?? request.Email;

            // If there is such user in DB - just return
            if (userWithFacebook != null)
            {
                var loginResponse = await _jwtService.BuildLoginResponse(userWithFacebook);

                return(loginResponse);
            }
            else if (userWithFacebook == null && email != null)
            {
                // Check if there is such user in DB, if so - add to it facebook id
                var existingUser = _unitOfWork.Repository <ApplicationUser>().Find(x => x.Email == email);

                if (existingUser != null)
                {
                    existingUser.FacebookId = profile.Id;

                    _unitOfWork.Repository <ApplicationUser>().Update(existingUser);
                    _unitOfWork.SaveChanges();


                    var loginResponse = await _jwtService.BuildLoginResponse(existingUser);

                    return(loginResponse);
                }
                else
                {
                    // In other case - create new user
                    var user = CreateUserWithEmail(new RegisterWithFacebookUsingEmailInternalModel
                    {
                        Email      = email,
                        FacebookId = profile.Id
                    });

                    var result = await _userManager.CreateAsync(user);

                    if (!result.Succeeded)
                    {
                        throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
                    }

                    result = await _userManager.AddToRoleAsync(user, Role.User);

                    if (!result.Succeeded)
                    {
                        throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
                    }

                    var loginResponse = await _jwtService.BuildLoginResponse(user);

                    return(loginResponse);
                }
            }
            else
            {
                throw new CustomException(HttpStatusCode.BadRequest, "token", "There is no user with such facebook id");
            }
        }
        public async Task <LoginResponseModel> ProcessRequest(LinkedInWithEmailRequestModel model)
        {
            var profile = await GetProfile(model.Token, model.RedirectUri, string.IsNullOrEmpty(model.Email));

            // If we didn`t get email from profile, get it from model
            var email = profile?.Email ?? model?.Email ?? null;

            var userWithLinkedIn = _unitOfWork.Repository <ApplicationUser>().Get(x => x.LinkedInId == profile.Id)
                                   .Include(x => x.VerificationTokens)
                                   .FirstOrDefault();

            // If there is such user in DB - just return
            if (userWithLinkedIn != null)
            {
                var loginResponse = await _jwtService.BuildLoginResponse(userWithLinkedIn);

                return(loginResponse);
            }
            else if (userWithLinkedIn == null && email != null)
            {
                // Check if there is such user in DB, if so - add to it google id
                var existingUser = _unitOfWork.Repository <ApplicationUser>().Find(x => x.Email == email);

                if (existingUser != null)
                {
                    existingUser.LinkedInId = profile.Id;

                    _unitOfWork.Repository <ApplicationUser>().Update(existingUser);
                    _unitOfWork.SaveChanges();

                    var loginResponse = await _jwtService.BuildLoginResponse(existingUser);

                    return(loginResponse);
                }
                else
                {
                    // In other case - create new user
                    var user = new ApplicationUser
                    {
                        Email          = email,
                        UserName       = email,
                        IsActive       = true,
                        RegistratedAt  = DateTime.UtcNow,
                        EmailConfirmed = false,
                        GoogleId       = profile.Id
                    };

                    var result = await _userManager.CreateAsync(user);

                    if (!result.Succeeded)
                    {
                        throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
                    }

                    result = await _userManager.AddToRoleAsync(user, Role.User);

                    if (!result.Succeeded)
                    {
                        throw new CustomException(HttpStatusCode.BadRequest, "general", result.Errors.FirstOrDefault().Description);
                    }

                    var loginResponse = await _jwtService.BuildLoginResponse(user);

                    return(loginResponse);
                }
            }
            else
            {
                throw new CustomException(HttpStatusCode.BadRequest, "token", "There is no user with such linkedin id");
            }
        }