Ejemplo n.º 1
0
        public async Task <IActionResult> LoginWith2fa(LoginWith2faViewModel model, bool rememberMe, string returnUrl = null)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                throw new Exception($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
            }

            var authenticatorCode = model.TwoFactorCode.Replace(" ", string.Empty).Replace("-", string.Empty);

            Microsoft.AspNetCore.Identity.SignInResult result = await loginService.TwoFactorAuthenticatorSignInAsync(authenticatorCode, rememberMe, model.RememberMachine);

            if (result.Succeeded)
            {
                _logger.LogInformation("User with ID {UserId} logged in with 2fa.", user.Id);
                return(RedirectToLocal(returnUrl));
            }
            else if (result.IsLockedOut)
            {
                _logger.LogWarning("User with ID {UserId} account locked out.", user.Id);
                return(RedirectToAction(nameof(Lockout)));
            }
            else
            {
                _logger.LogWarning("Invalid authenticator code entered for user with ID {UserId}.", user.Id);
                ModelState.AddModelError(string.Empty, "Invalid authenticator code.");
                return(View());
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> Register(RegisterViewModel model, string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            if (ModelState.IsValid)
            {
                var user   = new MongoIdentityUser(model.Email, model.Email);
                var result = await _userManager.CreateAsync(user, model.Password);

                if (result.Succeeded)
                {
                    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713
                    // Send an email with this link
                    //var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                    //var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
                    //await _emailSender.SendEmailAsync(model.Email, "Confirm your account",
                    //    $"Please confirm your account by clicking this link: <a href='{callbackUrl}'>link</a>");
                    await _signInManager.SignInAsync(user, isPersistent : false);

                    _logger.LogInformation(3, "User created a new account with password.");
                    return(RedirectToLocal(returnUrl));
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return(View(model));
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> LoginWithRecoveryCode(LoginWithRecoveryCodeViewModel model, string returnUrl = null)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                throw new ApplicationException($"Unable to load two-factor authentication user.");
            }

            var recoveryCode = model.RecoveryCode.Replace(" ", string.Empty);

            Microsoft.AspNetCore.Identity.SignInResult result = await loginService.TwoFactorRecoveryCodeSignInAsync(recoveryCode);

            if (result.Succeeded)
            {
                _logger.LogInformation("User with ID {UserId} logged in with a recovery code.", user.Id);
                return(RedirectToLocal(returnUrl));
            }
            if (result.IsLockedOut)
            {
                _logger.LogWarning("User with ID {UserId} account locked out.", user.Id);
                return(RedirectToAction(nameof(Lockout)));
            }
            else
            {
                _logger.LogWarning("Invalid recovery code entered for user with ID {UserId}", user.Id);
                ModelState.AddModelError(string.Empty, "Invalid recovery code entered.");
                return(View());
            }
        }
Ejemplo n.º 4
0
        public async Task <IActionResult> Register([FromBody] RegistrationUser model)
        {
            if (ModelState.IsValid)
            {
                var user = new MongoIdentityUser
                {
                    FirstName = model.FirstName,
                    LastName  = model.LastName,
                    City      = model.City,
                    UserName  = model.Email,
                    Email     = model.Email
                };
                var result = await _userManager.CreateAsync(user, model.Password);

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

                    var token    = TokenService.GenerateJwtToken(model.Email, user, _configuration);
                    var rootData = new RegistrationResponse(token, user.UserName, user.Email);
                    return(Created("api/v1/authentication/register", rootData));
                }
                return(Ok(string.Join(",", result.Errors?.Select(error => error.Description))));
            }
            string errorMessage = string.Join(", ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage));

            return(BadRequest(errorMessage ?? "Bad Request"));
        }
Ejemplo n.º 5
0
        public async Task <IActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl = null)
        {
            if (ModelState.IsValid)
            {
                // Get the information about the user from the external login provider
                var info = await _signInManager.GetExternalLoginInfoAsync();

                if (info == null)
                {
                    return(View("ExternalLoginFailure"));
                }
                var user   = new MongoIdentityUser(model.Email, model.Email);
                var result = await _userManager.CreateAsync(user);

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

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

                        _logger.LogInformation(6, "User created an account using {Name} provider.", info.LoginProvider);
                        return(RedirectToLocal(returnUrl));
                    }
                }
                AddErrors(result);
            }

            ViewData["ReturnUrl"] = returnUrl;
            return(View(model));
        }
        public async Task <Token> Handle(RegisterUserCommand request, CancellationToken cancellationToken)
        {
            var identityUser = new MongoIdentityUser(request.Email, request.Email);

            identityUser.AddClaim(new MongoUserClaim("Email", request.Email));
            identityUser.AddClaim(new MongoUserClaim("Type", EUserType.Committee.ToString()));

            var result = await _userManager.CreateAsync(identityUser, request.Password);

            if (!result.Succeeded)
            {
                foreach (int er in result.Errors.Select(x => Convert.ToInt32(x.Code)))
                {
                    _notificationContext.PushNotification((ReturnCode)er);
                }
                return(null);
            }

            var user = new Person()
            {
                IdentityUserId = identityUser.Id,
                Name           = request.Name,
                Email          = request.Email,
                Type           = EUserType.Committee,
                Approved       = true,
                ArticlesCount  = 0
            };

            await _repository.AddAsync <Person>(user);

            await _signInManager.SignInAsync(identityUser, false);

            return(await GerarJwt(identityUser));
        }
Ejemplo n.º 7
0
        public async Task <IActionResult> VerifyCode(string provider, bool rememberMe, string returnUrl = null)
        {
            // Require that the user has already logged in via username/password or external login
            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                return(View("Error"));
            }
            return(View(new VerifyCodeViewModel {
                Provider = provider, ReturnUrl = returnUrl, RememberMe = rememberMe
            }));
        }
        public async Task CanCreateAndDeleteUser()
        {
            var user         = new MongoIdentityUser("test_account", "*****@*****.**");
            var createResult = await _userStore.CreateAsync(user, CancellationToken.None);

            createResult.ShouldNotBeNull();
            createResult.Succeeded.ShouldBeTrue();

            var deleteResult = await _userStore.DeleteAsync(user, CancellationToken.None);

            deleteResult.ShouldNotBeNull();
            deleteResult.Succeeded.ShouldBeTrue();
        }
Ejemplo n.º 9
0
        public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
        {
            MongoIdentityUser user = await loginService.FindByUsername(context.UserName);

            if (await loginService.ValidateCredentials(user, context.Password))
            {
                context.Result = new GrantValidationResult(user.Id, OidcConstants.AuthenticationMethods.Password);
            }
            else
            {
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "invalid credential");
            }
        }
Ejemplo n.º 10
0
        public async Task <IActionResult> UseRecoveryCode(string returnUrl = null)
        {
            // Require that the user has already logged in via username/password or external login
            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                return(View("Error"));
            }
            return(View(new UseRecoveryCodeViewModel {
                ReturnUrl = returnUrl
            }));
        }
Ejemplo n.º 11
0
        public async Task <IActionResult> LoginWithRecoveryCode(string returnUrl = null)
        {
            // Ensure the user has gone through the username & password screen first
            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                throw new ApplicationException($"Unable to load two-factor authentication user.");
            }

            ViewData["ReturnUrl"] = returnUrl;

            return(View());
        }
#pragma warning restore SCS0029 // Potential XSS vulnerability

        private async Task LoadSharedKeyAndQrCodeUriAsync(MongoIdentityUser user, EnableAuthenticatorViewModel model)
        {
            var unformattedKey = await _userManager.GetAuthenticatorKeyAsync(user);

            if (string.IsNullOrEmpty(unformattedKey))
            {
                await _userManager.ResetAuthenticatorKeyAsync(user);

                unformattedKey = await _userManager.GetAuthenticatorKeyAsync(user);
            }

            model.SharedKey        = FormatKey(unformattedKey);
            model.AuthenticatorUri = GenerateQrCodeUri(unformattedKey, user.NormalizedEmail);
        }
Ejemplo n.º 13
0
        public async Task <IActionResult> ConfirmEmail(string userId, string code)
        {
            if (userId == null || code == null)
            {
                return(View("Error"));
            }
            MongoIdentityUser user = await _userManager.FindByIdAsync(userId);

            if (user == null)
            {
                return(View("Error"));
            }
            IdentityResult result = await _userManager.ConfirmEmailAsync(user, code);

            return(View(result.Succeeded ? nameof(ConfirmEmail) : "Error"));
        }
Ejemplo n.º 14
0
        public async Task MongoUserStore_ShouldPutThingsIntoUsersCollectionByDefault()
        {
            var user = new MongoIdentityUser(TestUtils.RandomString(10));


            using (var store = new MongoUserStore <MongoIdentityUser>(options))
            {
                // ACT
                var result = await store.CreateAsync(user, CancellationToken.None);

                // ASSERT
                Assert.True(result.Succeeded);

                Assert.Equal(1, await store.GetUserCountAsync());
            }
        }
Ejemplo n.º 15
0
        public async Task CreateAsync_ShouldCreateUser()
        {
            // ARRANGE
            MongoIdentityUser user;

            using (var userStore = new MongoUserStore <MongoIdentityUser>(options) as IUserStore <MongoIdentityUser>)
            {
                user = new MongoIdentityUser(TestUtils.RandomString(10));
                await userStore.CreateAsync(user, CancellationToken.None);

                var retrievedUser = await userStore.FindByIdAsync(user.Id, CancellationToken.None);

                Assert.NotNull(retrievedUser);
                Assert.Equal(user.UserName, retrievedUser.UserName);
                Assert.Equal(user.NormalizedUserName, retrievedUser.NormalizedUserName);
            }
        }
        public async Task CanCreateMultipleUsers()
        {
            var user1         = new MongoIdentityUser("test_account_1", "*****@*****.**");
            var createResult1 = await _userStore.CreateAsync(user1, CancellationToken.None);

            createResult1.ShouldNotBeNull();
            createResult1.Succeeded.ShouldBeTrue();

            var user2         = new MongoIdentityUser("test_account_2", "*****@*****.**");
            var createResult2 = await _userStore.CreateAsync(user2, CancellationToken.None);

            createResult2.ShouldNotBeNull();
            createResult2.Succeeded.ShouldBeTrue();

            await _userStore.DeleteAsync(user1, CancellationToken.None);

            await _userStore.DeleteAsync(user2, CancellationToken.None);
        }
Ejemplo n.º 17
0
        public async Task <IActionResult> LoginWith2fa(bool rememberMe, string returnUrl = null)
        {
            // Ensure the user has gone through the username & password screen first
            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                throw new Exception($"Unable to load two-factor authentication user.");
            }

            var model = new LoginWith2faViewModel {
                RememberMe = rememberMe
            };

            ViewData["ReturnUrl"] = returnUrl;

            return(View(model));
        }
Ejemplo n.º 18
0
        public async Task MongoUserStore_ShouldPutThingsIntoUsersCollectionByDefault()
        {
            var user = new MongoIdentityUser(TestUtils.RandomString(10));

            using (var dbProvider = MongoDbServerTestUtils.CreateDatabase())
            {
                var store = await MongoUserStore <MongoIdentityUser> .CreateAsync(dbProvider.Database);

                // ACT
                var result = await store.CreateAsync(user, CancellationToken.None);

                // ASSERT
                Assert.True(result.Succeeded);
                var collections      = await(await dbProvider.Database.ListCollectionsAsync()).ToListAsync();
                var collectionExists = collections.Any(x => x["name"].ToString().Equals("users", StringComparison.Ordinal));
                Assert.True(collectionExists, "Default collection name should not be changed from the initial collection name ('users') since it will cause breaking change to current users");
            }
        }
Ejemplo n.º 19
0
        public async Task <ActionResult> SendCode(string returnUrl = null, bool rememberMe = false)
        {
            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                return(View("Error"));
            }
            System.Collections.Generic.IList <string> userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user);

            var factorOptions = userFactors.Select(purpose => new SelectListItem {
                Text = purpose, Value = purpose
            }).ToList();

            return(View(new SendCodeViewModel {
                Providers = factorOptions, ReturnUrl = returnUrl, RememberMe = rememberMe
            }));
        }
Ejemplo n.º 20
0
        public async Task CanCreateUsingUserStore()
        {
            var serviceProvider = BuildServiceProvider();

            var userStore = serviceProvider.GetService <IUserStore <MongoIdentityUser> >();

            var user = new MongoIdentityUser
            {
                Email           = "*****@*****.**",
                UserName        = "******",
                PasswordHash    = "randomepassword",
                Name            = "name",
                NormalizedName  = "USER",
                EmailConfirmed  = true,
                NormalizedEmail = "*****@*****.**"
            };

            var cancelToken = new CancellationTokenSource();

            AssertSucceeded(await userStore.CreateAsync(user, cancelToken.Token));

            var found = await userStore.FindByIdAsync(user.Id, cancelToken.Token);

            Assert.NotNull(found);
            Assert.Equal(user.Email, found.Email);
            Assert.Equal(user.UserName, found.UserName);
            Assert.Equal(user.PasswordHash, found.PasswordHash);
            Assert.Equal(user.Name, found.Name);
            Assert.Equal(user.NormalizedName, found.NormalizedName);
            Assert.Equal(user.EmailConfirmed, found.EmailConfirmed);
            Assert.Equal(user.NormalizedEmail, found.NormalizedEmail);

            Assert.Equal("*****@*****.**", found.Email);
            Assert.Equal("someone.email", found.UserName);
            Assert.Equal("randomepassword", found.PasswordHash);
            Assert.Equal("name", found.Name);
            Assert.Equal("USER", found.NormalizedName);
            Assert.True(found.EmailConfirmed);
            Assert.Equal("*****@*****.**", found.NormalizedEmail);

            AssertSucceeded(await userStore.DeleteAsync(found, cancelToken.Token));
        }
        public async Task CreateAsync_ShouldCreateUser()
        {
            // ARRANGE
            using (var dbProvider = MongoDbServerTestUtils.CreateDatabase())
            {
                var userStore = new MongoUserStore <MongoIdentityUser>(dbProvider.Database) as IUserStore <MongoIdentityUser>;
                var user      = new MongoIdentityUser(TestUtils.RandomString(10));

                // ACT
                await userStore.CreateAsync(user, CancellationToken.None);

                // ASSERT
                var collection    = dbProvider.Database.GetDefaultCollection();
                var retrievedUser = await collection.FindByIdAsync(user.Id);

                Assert.NotNull(retrievedUser);
                Assert.Equal(user.UserName, retrievedUser.UserName);
                Assert.Equal(user.NormalizedUserName, retrievedUser.NormalizedUserName);
            }
        }
Ejemplo n.º 22
0
        public async Task <IActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl = null)
        {
            if (ModelState.IsValid)
            {
                // Get the information about the user from the external login provider
                ExternalLoginInfo info = await loginService.GetExternalLoginInfoAsync();

                if (info == null)
                {
                    return(View("ExternalLoginFailure"));
                }
                var            user   = new MongoIdentityUser(model.Email, model.Email);
                IdentityResult result = await _userManager.CreateAsync(user);

                if (result.Succeeded)
                {
                    var addToRoleResult = await _userManager.AddToRoleAsync(user, "user");

                    await _userManager.ConfirmEmailAsync(user, await _userManager.GenerateEmailConfirmationTokenAsync(user));

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

                    if (result.Succeeded && addToRoleResult.Succeeded)
                    {
                        await loginService.SignInAsync(user, isPersistent : false);

                        _logger.LogInformation(6, "User created an account using {Name} provider.", info.LoginProvider);

                        // Update any authentication tokens as well
                        await loginService.UpdateExternalAuthenticationTokensAsync(info);

                        return(RedirectToLocal(returnUrl));
                    }
                }
                AddErrors(result);
            }

            ViewData["ReturnUrl"] = returnUrl;
            return(View(model));
        }
Ejemplo n.º 23
0
        public async Task <IActionResult> SendCode(SendCodeViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View());
            }

            MongoIdentityUser user = await loginService.GetTwoFactorAuthenticationUserAsync();

            if (user == null)
            {
                return(View("Error"));
            }

            if (model.SelectedProvider == "Authenticator")
            {
                return(RedirectToAction(nameof(VerifyAuthenticatorCode), new { model.ReturnUrl, model.RememberMe }));
            }

            // Generate the token and send it
            var code = await _userManager.GenerateTwoFactorTokenAsync(user, model.SelectedProvider);

            if (string.IsNullOrWhiteSpace(code))
            {
                return(View("Error"));
            }

            var message = "Your security code is: " + code;

            if (model.SelectedProvider == "Email")
            {
                await _emailSender.SendEmailAsync(await _userManager.GetEmailAsync(user), "Security Code", message);
            }
            else if (model.SelectedProvider == "Phone")
            {
                await _smsSender.SendSmsAsync(await _userManager.GetPhoneNumberAsync(user), message);
            }

            return(RedirectToAction(nameof(VerifyCode), new { Provider = model.SelectedProvider, ReturnUrl = model.ReturnUrl, RememberMe = model.RememberMe }));
        }
Ejemplo n.º 24
0
        public async Task <IActionResult> ResetPassword(ResetPasswordViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }
            MongoIdentityUser user = await _userManager.FindByEmailAsync(model.Email);

            if (user == null)
            {
                // Don't reveal that the user does not exist
                return(RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account"));
            }
            IdentityResult result = await _userManager.ResetPasswordAsync(user, model.Code, model.Password);

            if (result.Succeeded)
            {
                return(RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account"));
            }
            AddErrors(result);
            return(View());
        }
Ejemplo n.º 25
0
        public async Task MongoIdentityUser_ShouldSaveAndRetrieveTheFutureOccuranceCorrectly()
        {
            var lockoutEndDate = new DateTime(2017, 2, 1, 0, 0, 0, DateTimeKind.Utc).AddTicks(8996910);
            var user           = new MongoIdentityUser(TestUtils.RandomString(10));

            user.LockUntil(lockoutEndDate);

            using (var dbProvider = MongoDbServerTestUtils.CreateDatabase())
            {
                var store = await MongoUserStore <MongoIdentityUser> .CreateAsync(dbProvider.Database);

                // ACT
                var result = await store.CreateAsync(user, CancellationToken.None);

                // ASSERT
                Assert.True(result.Succeeded);
                var collection    = dbProvider.Database.GetCollection <MongoIdentityUser>(Constants.DefaultCollectionName);
                var retrievedUser = await collection.FindByIdAsync(user.Id);

                Assert.Equal(user.LockoutEndDate, retrievedUser.LockoutEndDate);
            }
        }
Ejemplo n.º 26
0
        public static string GenerateJwtToken(string email, MongoIdentityUser user, IConfiguration configuration)
        {
            var claims = new List <Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, email),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
            };

            var key     = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JwtKey"]));
            var creds   = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var expires = DateTime.Now.AddDays(Convert.ToDouble(configuration["JwtExpireDays"]));

            var token = new JwtSecurityToken(
                configuration["JwtIssuer"],
                configuration["JwtIssuer"],
                claims,
                expires: expires,
                signingCredentials: creds
                );

            return(new JwtSecurityTokenHandler().WriteToken(token));
        }
Ejemplo n.º 27
0
        public async Task <IActionResult> ForgotPassword(ForgotPasswordViewModel model)
        {
            if (ModelState.IsValid)
            {
                MongoIdentityUser user = await _userManager.FindByEmailAsync(model.Email);

                if (user == null || !(await _userManager.IsEmailConfirmedAsync(user)))
                {
                    // Don't reveal that the user does not exist or is not confirmed
                    return(View(nameof(ForgotPasswordConfirmation)));
                }

                // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713
                // Send an email with this link
                //var code = await _userManager.GeneratePasswordResetTokenAsync(user);
                //var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
                //await _emailSender.SendEmailAsync(model.Email, "Reset Password",
                //   "Please reset your password by clicking here: <a href=\"" + callbackUrl + "\">link</a>");
                //return View("ForgotPasswordConfirmation");
            }

            // If we got this far, something failed, redisplay form
            return(View(model));
        }
        public async Task <bool> Handle(ImportArticlesEvaluatorsCommand request, CancellationToken cancellationToken)
        {
            var evaluators = new List <EvaluatorsImportAux>();

            List <dynamic> evaluatorsDistinct = request.Articles.SelectMany(x =>
            {
                var ls = new List <object>
                {
                    new
                    {
                        Email = x.Email1.Trim(),
                        Nome  = x.Avaliador1.Trim()
                    }
                };

                if (!string.IsNullOrEmpty(x.Email2))
                {
                    ls.Add(new
                    {
                        Email = x.Email2.Trim(),
                        Nome  = x.Avaliador2.Trim()
                    });
                }

                return(ls);
            }).Distinct().ToList();
            var gen = new PassowordGenerator();

            foreach (var avaliador in evaluatorsDistinct)
            {
                MongoIdentityUser avaliadorSalvo = await _userManager.FindByEmailAsync(avaliador.Email);

                if (avaliadorSalvo == null)
                {
                    var identityUser = new MongoIdentityUser(avaliador.Email, avaliador.Email);

                    identityUser.AddClaim(new MongoUserClaim("Email", avaliador.Email));
                    identityUser.AddClaim(new MongoUserClaim("Type", EUserType.Evaluator.ToString()));

                    var senha  = gen.Generate();
                    var result = await _userManager.CreateAsync(identityUser, senha);

                    if (!result.Succeeded)
                    {
                        continue;
                    }

                    var person = new Person()
                    {
                        IdentityUserId     = identityUser.Id,
                        Name               = avaliador.Nome,
                        IsSei              = true,
                        Email              = avaliador.Email,
                        IsSicite           = true,
                        AttendedModalities = new List <string>(),
                        Institution        = "UTFPR",
                        Type               = EUserType.Evaluator,
                        Approved           = true,
                        ArticlesCount      = 0
                    };

                    await _repository.AddAsync(person);

                    evaluators.Add(new EvaluatorsImportAux()
                    {
                        Email       = person.Email,
                        Id          = person.Id,
                        Modalidades = new HashSet <string>(),
                        Nome        = person.Name
                    });

                    Debug.WriteLine($"User: {person.Id} - {senha}");

                    await Task.Delay(100);
                }
                else
                {
                    var person = (await _repository.GetByFilter(Builders <Person> .Filter.Eq(x => x.IdentityUserId, avaliadorSalvo.Id))).SingleOrDefault();

                    evaluators.Add(new EvaluatorsImportAux()
                    {
                        Email       = person.Email,
                        Id          = person.Id,
                        Modalidades = new HashSet <string>(),
                        Nome        = person.Name
                    });
                }
            }

            foreach (var artImport in request.Articles.Distinct())
            {
                var article = await _repository.GetFirstOrDefaultByFilter(
                    Builders <Article> .Filter.And(
                        Builders <Article> .Filter.Eq(x => x.SubmissionId, artImport.SubmissionId.ToString()),
                        Builders <Article> .Filter.Eq(x => x.Event, request.Event)
                        )
                    );

                if (article == null)
                {
                    Debug.WriteLine($"Artigo: {artImport.SubmissionId} - Não Encontrado no Evento {request.Event.ToString()} - Possível divergência nos arquivos");
                    continue;
                }

                article.LocalDetails = artImport.Local;
                article.Room         = artImport.Sala;

                var dataDecomposed = artImport.Data.Trim().Split("/").Select(x => Convert.ToInt32(x)).ToArray();
                var horaDecomposed = artImport.Hora.Trim().Split(":").Select(x => Convert.ToInt32(x)).ToArray();
                article.StartDate = new DateTime(dataDecomposed[2], dataDecomposed[0], dataDecomposed[1], horaDecomposed[0], horaDecomposed[1], 0);

                var evaluator1 = evaluators.FirstOrDefault(x => x.Email == artImport.Email1.Trim());
                if (evaluator1 != null)
                {
                    article.EvaluatorId = evaluator1.Id;
                    evaluator1.Modalidades.Add(article.Modality);
                }

                if (!string.IsNullOrEmpty(artImport.Email2))
                {
                    var evaluator2 = evaluators.FirstOrDefault(x => x.Email == artImport.Email2.Trim());

                    if (evaluator2 != null)
                    {
                        article.Evaluator2Id = evaluator2.Id;

                        evaluator2.Modalidades.Add(article.Modality);
                    }
                }

                await _repository.SaveOrUpdateAsync(article, article.Id);

                await Task.Delay(100);
            }

            foreach (var evaluat in evaluators)
            {
                var eval = await _repository.GetByIdAsync <Person>(evaluat.Id);

                var modalities = new List <string>(eval.AttendedModalities);

                modalities.AddRange(evaluat.Modalidades);

                eval.AttendedModalities = modalities.Distinct().ToList();

                await _repository.SaveOrUpdateAsync(eval, eval.Id);

                await Task.Delay(100);
            }

            return(true);
        }
Ejemplo n.º 29
0
        private IEnumerable <Claim> GetClaimsFromUser(MongoIdentityUser user)
        {
            var claims = new List <Claim>
            {
                new Claim(JwtClaimTypes.Subject, user.Id),
                new Claim(JwtClaimTypes.PreferredUserName, user.UserName),
                new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName)
            };

            //if (!string.IsNullOrWhiteSpace(user.Name))
            //    claims.Add(new Claim("name", user.Name));

            //if (!string.IsNullOrWhiteSpace(user.LastName))
            //    claims.Add(new Claim("last_name", user.LastName));

            //if (!string.IsNullOrWhiteSpace(user.CardNumber))
            //    claims.Add(new Claim("card_number", user.CardNumber));

            //if (!string.IsNullOrWhiteSpace(user.CardHolderName))
            //    claims.Add(new Claim("card_holder", user.CardHolderName));

            //if (!string.IsNullOrWhiteSpace(user.SecurityNumber))
            //    claims.Add(new Claim("card_security_number", user.SecurityNumber));

            //if (!string.IsNullOrWhiteSpace(user.Expiration))
            //    claims.Add(new Claim("card_expiration", user.Expiration));

            //if (!string.IsNullOrWhiteSpace(user.City))
            //    claims.Add(new Claim("address_city", user.City));

            //if (!string.IsNullOrWhiteSpace(user.Country))
            //    claims.Add(new Claim("address_country", user.Country));

            //if (!string.IsNullOrWhiteSpace(user.State))
            //    claims.Add(new Claim("address_state", user.State));

            //if (!string.IsNullOrWhiteSpace(user.Street))
            //    claims.Add(new Claim("address_street", user.Street));

            //if (!string.IsNullOrWhiteSpace(user.ZipCode))
            //    claims.Add(new Claim("address_zip_code", user.ZipCode));

            if (userManager.SupportsUserEmail)
            {
                claims.AddRange(new[]
                {
                    new Claim(JwtClaimTypes.Email, user.NormalizedEmail),
                    new Claim(JwtClaimTypes.EmailVerified, user.EmailConfirmed ? "true" : "false", ClaimValueTypes.Boolean)
                });
            }

            if (userManager.SupportsUserPhoneNumber && !string.IsNullOrWhiteSpace(user.PhoneNumber))
            {
                claims.AddRange(new[]
                {
                    new Claim(JwtClaimTypes.PhoneNumber, user.PhoneNumber),
                    new Claim(JwtClaimTypes.PhoneNumberVerified, user.PhoneNumberConfirmed ? "true" : "false", ClaimValueTypes.Boolean)
                });
            }

            return(claims);
        }
        private async Task <MongoIdentityUser> AutoProvisionUser(string provider, string providerUserId, IEnumerable <Claim> claims)
        {
            // create a list of claims that we want to transfer into our store
            var filtered = new List <Claim>();

            // user's display name
            var name = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Name)?.Value ??
                       claims.FirstOrDefault(x => x.Type == ClaimTypes.Name)?.Value;

            if (name != null)
            {
                filtered.Add(new Claim(JwtClaimTypes.Name, name));
            }
            else
            {
                var first = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.GivenName)?.Value ??
                            claims.FirstOrDefault(x => x.Type == ClaimTypes.GivenName)?.Value;
                var last = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.FamilyName)?.Value ??
                           claims.FirstOrDefault(x => x.Type == ClaimTypes.Surname)?.Value;
                if (first != null && last != null)
                {
                    filtered.Add(new Claim(JwtClaimTypes.Name, first + " " + last));
                }
                else if (first != null)
                {
                    filtered.Add(new Claim(JwtClaimTypes.Name, first));
                }
                else if (last != null)
                {
                    filtered.Add(new Claim(JwtClaimTypes.Name, last));
                }
            }

            // email
            var email = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Email)?.Value ??
                        claims.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value;

            if (email != null)
            {
                filtered.Add(new Claim(JwtClaimTypes.Email, email));
            }

            var user           = new MongoIdentityUser(Guid.NewGuid().ToString(), email);
            var identityResult = await _userManager.CreateAsync(user);

            if (!identityResult.Succeeded)
            {
                throw new Exception(identityResult.Errors.First().Description);
            }

            if (filtered.Any())
            {
                identityResult = await _userManager.AddClaimsAsync(user, filtered);

                if (!identityResult.Succeeded)
                {
                    throw new Exception(identityResult.Errors.First().Description);
                }
            }

            identityResult = await _userManager.AddLoginAsync(user, new UserLoginInfo(provider, providerUserId, provider));

            if (!identityResult.Succeeded)
            {
                throw new Exception(identityResult.Errors.First().Description);
            }

            return(user);
        }