コード例 #1
0
        public async Task<IActionResult> Login(LoginViewModel model, string returnUrl)
        {
            ViewData["Title"] = "Log in";
            ViewData["ReturnUrl"] = returnUrl;
            if ((Site.RequireCaptchaOnLogin)&& (Site.RecaptchaPublicKey.Length > 0))
            {
                model.RecaptchaSiteKey = Site.RecaptchaPublicKey;
                model.LoginInfoTop = Site.LoginInfoTop;
                model.LoginInfoBottom = Site.LoginInfoBottom;
            }

            if (!ModelState.IsValid)
            {
                return View(model);
            }

            if ((Site.RequireCaptchaOnLogin) && (Site.RecaptchaPublicKey.Length > 0))
            {
                string recpatchaSecretKey = Site.RecaptchaPrivateKey;
                
                var captchaResponse = await this.ValidateRecaptcha(Request, recpatchaSecretKey);

                if (!captchaResponse.Success)
                {
                    ModelState.AddModelError("recaptchaerror", "reCAPTCHA Error occured. Please try again");
                    return View(model);
                }
            }


            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, change to shouldLockout: true
            var result = await signInManager.PasswordSignInAsync(
                model.Email,
                model.Password,
                model.RememberMe,
                lockoutOnFailure : false);
            
            if (result.Succeeded)
            {
                return this.RedirectToLocal(returnUrl);
            }
            if (result.RequiresTwoFactor)
            {
                return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            }
            if (result.IsLockedOut)
            {
                return View("Lockout");
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                return View(model);
            }
        }
コード例 #2
0
        public IActionResult Login(string returnUrl)
        {
            ViewData["Title"] = "Log in";
            ViewData["ReturnUrl"] = returnUrl;
            LoginViewModel model = new LoginViewModel();
            model.ExternalAuthenticationList = signInManager.GetExternalAuthenticationSchemes();
            if ((Site.CaptchaOnLogin)&& (Site.RecaptchaPublicKey.Length > 0))
            {
                model.RecaptchaSiteKey = Site.RecaptchaPublicKey;     
            }

            model.LoginInfoTop = Site.LoginInfoTop;
            model.LoginInfoBottom = Site.LoginInfoBottom;

            return View(model);
        }
コード例 #3
0
        public async Task<IActionResult> Login(string returnUrl = null)
        {
            if (signInManager.IsSignedIn(User))
            {
                return this.RedirectToSiteRoot(Site);
            }

            returnUrl = identityServerIntegration.EnsureFolderSegmentIfNeeded(Site, returnUrl);
            //identityserver integration point
            var idProvider = await identityServerIntegration.GetAuthorizationContextAsync(returnUrl);

            if (!string.IsNullOrEmpty(idProvider))
            {
                // if IdP is passed, then bypass showing the login screen
                return ExternalLogin(idProvider, returnUrl);
            }

            ViewData["Title"] = sr["Log in"];
            ViewData["ReturnUrl"] = returnUrl;
            LoginViewModel model = new LoginViewModel();
            
            if ((Site.CaptchaOnLogin)&& (Site.RecaptchaPublicKey.Length > 0))
            {
                model.RecaptchaSiteKey = Site.RecaptchaPublicKey;     
            }
            model.UseEmailForLogin = Site.UseEmailForLogin;
            model.LoginInfoTop = Site.LoginInfoTop;
            model.LoginInfoBottom = Site.LoginInfoBottom;
            model.ExternalAuthenticationList = signInManager.GetExternalAuthenticationSchemes();
            // don't disable db auth if there are no social auth providers configured
            model.DisableDbAuth = Site.DisableDbAuth && Site.HasAnySocialAuthEnabled();

            return View(model);
        }
コード例 #4
0
        public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
        {
            ViewData["Title"] = sr["Log in"];
            ViewData["ReturnUrl"] = returnUrl;
            if ((Site.CaptchaOnLogin)&& (Site.RecaptchaPublicKey.Length > 0))
            {
                model.RecaptchaSiteKey = Site.RecaptchaPublicKey;   
            }
            model.UseEmailForLogin = Site.UseEmailForLogin;
            model.LoginInfoTop = Site.LoginInfoTop;
            model.LoginInfoBottom = Site.LoginInfoBottom;
            model.ExternalAuthenticationList = signInManager.GetExternalAuthenticationSchemes();
            // don't disable db auth if there are no social auth providers configured
            model.DisableDbAuth = Site.DisableDbAuth && Site.HasAnySocialAuthEnabled();

            if (!ModelState.IsValid)
            {
                return View(model);
            }

            if ((Site.CaptchaOnLogin) && (Site.RecaptchaPublicKey.Length > 0))
            {
                var recpatchaSecretKey = Site.RecaptchaPrivateKey;
                var captchaResponse = await this.ValidateRecaptcha(Request, recpatchaSecretKey);

                if (!captchaResponse.Success)
                {
                    ModelState.AddModelError("recaptchaerror", sr["reCAPTCHA Error occured. Please try again"]);
                    return View(model);
                }
            }

            if(userManager.Site.RequireConfirmedEmail || userManager.Site.RequireApprovalBeforeLogin)
            {
                var user = await userManager.FindByNameAsync(model.Email);
                if (user != null)
                {
                    // TODO: showing these messages is not right
                    // this can be used by a hacker to determine that an account exists
                    // need to fix this
                    // probably all of these checks should be moved into signInManager.PasswordSignInAsync
                    // so that we either redirect to show message if login was correct credentials
                    // or just show invalid login attempt otherwise

                    if (userManager.Site.RequireConfirmedEmail)
                    {
                        if (!await userManager.IsEmailConfirmedAsync(user))
                        {
                            //ModelState.AddModelError(string.Empty, "You must have a confirmed email to log in.");
                            ModelState.AddModelError(string.Empty, sr["Invalid login attempt."]);
                            return View(model);
                        }
                    }

                    if(userManager.Site.RequireApprovalBeforeLogin)
                    {
                        if(!user.AccountApproved)
                        {
                            //ModelState.AddModelError(string.Empty, "Your account must be approved by an administrator before you can log in. If an administrator approves your account, you will receive an email notifying you that your account is ready.");
                            ModelState.AddModelError(string.Empty, sr["Invalid login attempt."]);
                            return View(model);
                        }
                    }

                    if((user.IsLockedOut)||(user.IsDeleted))
                    {
                        //ModelState.AddModelError(string.Empty, "Your account must be approved by an administrator before you can log in. If an administrator approves your account, you will receive an email notifying you that your account is ready.");
                        ModelState.AddModelError(string.Empty, sr["Invalid login attempt."]);
                        return View(model);
                    }
                    
                }
            }
            
            var persistent = false;
            if(userManager.Site.AllowPersistentLogin)
            {
                //TODO: hide remember me in view if persistent login not allowed  site settings
                persistent = model.RememberMe;
            }

            Microsoft.AspNetCore.Identity.SignInResult result;
            if(Site.UseEmailForLogin)
            {
                result = await signInManager.PasswordSignInAsync(
                    model.Email,
                    model.Password,
                    persistent,
                    lockoutOnFailure: false);
            }
            else
            {
                result = await signInManager.PasswordSignInAsync(
                    model.UserName,
                    model.Password,
                    persistent,
                    lockoutOnFailure: false);
            }
            
            
            if (result.Succeeded)
            {
                SiteUser user;
                if(Site.UseEmailForLogin)
                {
                    user = await userManager.FindByNameAsync(model.Email);
                }
                else
                {
                    user = await userManager.FindByNameAsync(model.UserName);
                }
                
                if(user != null)
                {
                    await ipAddressTracker.TackUserIpAddress(Site.Id, user.Id);
                }

                if (!string.IsNullOrEmpty(returnUrl))
                {
                    return LocalRedirect(returnUrl);
                }

                return this.RedirectToSiteRoot(Site);

            }
            if (result.RequiresTwoFactor)
            {
                return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            }
            if (result.IsLockedOut)
            {
                return View("Lockout");
            }
            else
            {
                ModelState.AddModelError(string.Empty, sr["Invalid login attempt."]);
                return View(model);
            }
        }
コード例 #5
0
        public async Task<IActionResult> Login(LoginViewModel model, string returnUrl)
        {
            ViewData["Title"] = "Log in";
            ViewData["ReturnUrl"] = returnUrl;
            if ((Site.CaptchaOnLogin)&& (Site.RecaptchaPublicKey.Length > 0))
            {
                model.RecaptchaSiteKey = Site.RecaptchaPublicKey;
                model.LoginInfoTop = Site.LoginInfoTop;
                model.LoginInfoBottom = Site.LoginInfoBottom;
            }

            if (!ModelState.IsValid)
            {
                return View(model);
            }

            if ((Site.CaptchaOnLogin) && (Site.RecaptchaPublicKey.Length > 0))
            {
                string recpatchaSecretKey = Site.RecaptchaPrivateKey;
                
                var captchaResponse = await this.ValidateRecaptcha(Request, recpatchaSecretKey);

                if (!captchaResponse.Success)
                {
                    ModelState.AddModelError("recaptchaerror", "reCAPTCHA Error occured. Please try again");
                    return View(model);
                }
            }

            if(userManager.Site.UseSecureRegistration || userManager.Site.RequireApprovalBeforeLogin)
            {
                var user = await userManager.FindByNameAsync(model.Email);
                if (user != null)
                {
                    if (userManager.Site.UseSecureRegistration)
                    {
                        if (!await userManager.IsEmailConfirmedAsync(user))
                        {
                            ModelState.AddModelError(string.Empty, "You must have a confirmed email to log in.");
                            return View(model);
                        }
                    }

                    if(userManager.Site.RequireApprovalBeforeLogin)
                    {
                        if(!user.AccountApproved)
                        {
                            ModelState.AddModelError(string.Empty, "Your account must be approved by an administrator before you can log in. If an administrator approves your account, you will receive an email notifying you that your account is ready.");
                            return View(model);
                        }
                    }
                    
                }
            }


            //TODO: we don't want to lockout on first failure, we need something more advanced
            // based on sitesettings
            //var maxFailures = userManager.Site.MaxInvalidPasswordAttempts;
            // probably need to override signInManager.PasswordSignInAsync
            // or create a new method that does what we want
            // we also need to prevent login if site requires confirmed email
            // and user email is not confirmed
            // also need to prevent login if site requires approval before new users can login
            // and user is not yet approved
            // also need a UI to manually lockout a user 


            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, change to lockoutOnFailure: true
            bool persistent = false;
            if(userManager.Site.AllowPersistentLogin)
            {
                //TODO: hide remember me in view if persistent login not allowed  site settings
                persistent = model.RememberMe;
            }
            var result = await signInManager.PasswordSignInAsync(
                model.Email,
                model.Password,
                persistent,
                lockoutOnFailure : false);
            
            if (result.Succeeded)
            {
                return this.RedirectToLocal(returnUrl);
            }
            if (result.RequiresTwoFactor)
            {
                return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            }
            if (result.IsLockedOut)
            {
                return View("Lockout");
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                return View(model);
            }
        }