Ejemplo n.º 1
0
        public async Task <BLSingleResponse <LoginRespDto> > LoginAsync(LoginDto model)
        {
            var response = new BLSingleResponse <LoginRespDto>();

            //new PasswordHasher<UserDto>().HashPassword(model.Username, pPassword);

            try
            {
                var signInResul = await _accountManager.SignInAsync(model.Username, model.Password, model.RememberMe);

                if (signInResul == SignInResult.Failed)
                {
                    response.Data = new LoginRespDto("Username or Password is invalid.");
                }
                else if (signInResul == SignInResult.TwoFactorRequired)
                {
                    response.Data = new LoginRespDto("This User does not confirmed email or phone.");
                }
                else if (signInResul == SignInResult.LockedOut)
                {
                    response.Data = new LoginRespDto("This User is currently locked out.");
                }
                else
                {
                    var user = await _accountManager.UserManager.FindByNameAsync(model.Username);

                    var role = await _accountManager.GetRoleByUserAsync(user);

                    if (role != null)
                    {
                        var tokenResul = _tokenProvider.GenerateToken(user, role);
                        response.Data = new LoginRespDto {
                            Token = tokenResul.Token, ExpirationDate = tokenResul.ExpirationDate
                        };
                    }
                    else
                    {
                        response.Data = new LoginRespDto("This User has no role assigned.");
                        await _accountManager.SignOutAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                HandleSVCException(response, ex);
            }

            return(response);
        }
Ejemplo n.º 2
0
        public async Task <BLSingleResponse <string> > HandleExternalLoginAsync()
        {
            var response = new BLSingleResponse <string>();

            try
            {
                //retrieves user information stored in a cookie
                var extLoginInfo = await _accountManager.GetExternalLoginInfoAsync();

                //check if the user has previously logged in using the external login provider
                var result = await _accountManager.ExternalLoginSignInAsync(extLoginInfo.LoginProvider, extLoginInfo.ProviderKey, isPersistent : false);

                if (result.Succeeded) //user does already exist
                {
                    var user = await _accountManager.UserManager.FindByNameAsync(_accountManager.Context.User.Identity.Name);

                    var role = await _accountManager.GetRoleByUserAsync(user);

                    response.Data = _tokenProvider.GenerateToken(user, role).Token;
                }
                else //user does not exist yet
                {
                    var defaultRole = new ApplicationRole(RolesEnum.STUDENT.GetDescription());
                    var email       = extLoginInfo.Principal.FindFirstValue(ClaimTypes.Email);

                    ApplicationUser newUser = _userManager.Users.SingleOrDefault(u => u.Email == email);

                    if (newUser == null)
                    {
                        newUser = new ApplicationUser(email.Split('@')[0], email,
                                                      extLoginInfo.Principal.FindFirstValue(ClaimTypes.GivenName),
                                                      extLoginInfo.Principal.FindFirstValue(ClaimTypes.Surname))
                        {
                            EmailConfirmed = true
                        };

                        var createResult = await _userManager.CreateAsync(newUser, new List <ApplicationRole> {
                            defaultRole
                        });

                        if (!createResult.Succeeded)
                        {
                            throw new Exception(createResult.Errors.Select(e => e.Description)
                                                .Aggregate((errors, error) => $"{errors}, {error}"));
                        }
                    }

                    //associate the new user with the external login provider
                    await _userManager.AddLoginAsync(newUser, extLoginInfo);

                    var newUserClaims = extLoginInfo.Principal.Claims;
                    newUserClaims.Append(new Claim("userid", newUser.Id.ToString()));
                    newUserClaims.Append(new Claim(ClaimTypes.Role, defaultRole.Name));

                    await _userManager.AddClaimsAsync(newUser, newUserClaims);

                    await _accountManager.SignInAsync(newUser.UserName, newUser.PasswordHash, false);

                    response.Data = _tokenProvider.GenerateToken(newUser, defaultRole).Token;
                }
            }

            catch (Exception ex)
            {
                HandleSVCException(ex);
            }

            return(response);
        }