Exemplo n.º 1
0
        public async Task <ActionResult> LocalLogin(LoginViewModel loginViewModel)
        {
            var authenticatedUser = await SetUser();

            if (authenticatedUser.Key != null &&
                authenticatedUser.Key.Identity != null &&
                authenticatedUser.Key.Identity.IsAuthenticated)
            {
                return(RedirectToAction("Index", "User"));
            }

            if (loginViewModel == null)
            {
                throw new ArgumentNullException(nameof(loginViewModel));
            }

            if (!ModelState.IsValid)
            {
                await TranslateView(DefaultLanguage);
                await SetIdProviders(loginViewModel);

                return(View("Index", loginViewModel));
            }

            try
            {
                var resourceOwner = await _loginActions.LocalAuthenticate(loginViewModel.ToParameter(), _eidAuthenticateOptions.ImagePath, Request.GetAbsoluteUriWithVirtualPath());

                var claims = resourceOwner.Claims;
                claims.Add(new Claim(ClaimTypes.AuthenticationInstant,
                                     DateTimeOffset.UtcNow.ConvertToUnixTimestamp().ToString(CultureInfo.InvariantCulture),
                                     ClaimValueTypes.Integer));
                var subject = claims.First(c => c.Type == SimpleIdentityServer.Core.Jwt.Constants.StandardResourceOwnerClaimNames.Subject).Value;
                await SetLocalCookie(claims, Guid.NewGuid().ToString());

                _simpleIdentityServerEventSource.AuthenticateResourceOwner(subject);
                return(RedirectToAction("Index", "User"));
            }
            catch (Exception exception)
            {
                _simpleIdentityServerEventSource.Failure(exception.Message);
                await TranslateView("en");

                ModelState.AddModelError("invalid_credentials", exception.Message);
                await SetIdProviders(loginViewModel);

                return(View("Index", loginViewModel));
            }
        }