public JsonResult Signin(SigninVM viewModel)
        {
            var clientResult = new JsonData <MemberSessionVM>()
            {
            };
            var encryptPassword = viewModel.Password.Trim().ToMD5();
            var loginLogId      = Guid.NewGuid();

            services.Command((db) =>
            {
                db.Insert <LoginLog>(new LoginLog()
                {
                    LogID        = loginLogId,
                    Account      = viewModel.Account.Trim(),
                    Password     = StringHelper.EncryptPassword(viewModel.Password),
                    InTime       = DateTime.Now,
                    Sucessed     = false,
                    IPAddress    = RequestHelper.IPAddress,
                    HttpMethod   = Request.HttpMethod,
                    AjaxRequest  = Request.IsAjaxRequest(),
                    MobileDevice = Request.Browser.IsMobileDevice,
                    Platform     = Request.Browser.Platform,
                    Browser      = Request.Browser.Type,
                    LogMemberID  = default(Guid)
                });

                var query = db.Queryable <Member>();
                Expression <Func <Member, bool> > whereExpr = u => u.Account == viewModel.Account.Trim() && u.Password == encryptPassword;
                bool exit = query.Any(whereExpr);
                if (exit)
                {
                    var member = query.SingleOrDefault(whereExpr);
                    if (member.Enable && member.Pass)
                    {
                        db.Update <LoginLog>(new { Sucessed = true, member.MemberID }, u => u.LogID == loginLogId);
                        Mapper.Initialize(c => c.CreateMap <Member, MemberSessionVM>());
                        var memberVM             = Mapper.Map <MemberSessionVM>(member);
                        memberVM.LogID           = loginLogId;
                        Session[Keys.SessionKey] = memberVM;
                        clientResult.SetClientData("y", "登录成功", memberVM);
                    }
                    if (!member.Enable)
                    {
                        clientResult.SetClientData("n", "该账号已被禁用");
                    }
                    if (!member.Pass)
                    {
                        clientResult.SetClientData("n", "该账号还在审核中");
                    }
                }
                else
                {
                    clientResult.SetClientData("n", "账号或密码错误");
                }
            });

            return(Json(clientResult));
        }
        // GET: User
        public ActionResult Signin()
        {
            SigninVM vm = new SigninVM();

            if (TempData["Message"] != null)
            {
                vm.Message = (string)TempData["Message"];
            }
            return(View(vm));
        }
        public async Task <IActionResult> Authenticate([FromBody] SigninVM userParam)
        {
            if (await userService.ExistsUser(userParam.Email) == false)
            {
                return(NotFound());
            }

            var user = await userService.AuthenticateAsync(userParam.Email, userParam.Password);

            if (user == null)
            {
                return(BadRequest(new { message = "Username or password is incorrect" }));
            }

            return(Ok(user));
        }
Exemple #4
0
        public async Task <IActionResult> Post(SigninVM model)
        {
            User _user = new User();

            #region #1 帳密資訊驗證

            if (model.ClientId == null)
            {
                return(new BadRequestObjectResult("invalid_clientid: Please provide 'Client ID'."));
            }

            var audience = db.Audiences.Where(x => x.AudienceId == model.ClientId);
            if (audience == null)
            {
                return(new BadRequestObjectResult($"invalid_clientid: Client ID '{model.ClientId}' is isvalid."));
            }

            //取得 Jwt 過程中的帳號與密碼驗證
            if (string.IsNullOrEmpty(model.Account) || string.IsNullOrEmpty(model.Password))
            {
                return(new BadRequestObjectResult($"invalid_clientid: Account or password is incorrect."));
            }
            else
            {
                _user = db.Users.Single(x => x.Account == model.Account && x.Password == model.Password);

                //使用者資訊驗證
                if (_user == null)
                {
                    return(new BadRequestObjectResult($"invalid_clientid: Account or password is incorrect."));
                }
            }
            #endregion

            #region #2 資訊驗證成功,建立 Identity

            //取出帳號所屬角色資訊
            List <Claim> role_claim = new List <Claim>();
            if (_user.Roles != null && _user.Roles.Count() > 0)
            {
                foreach (var r in _user.Roles)
                {
                    role_claim.Add(new Claim(ClaimTypes.Role, r));
                }
            }

            //建立 Identity.Claim
            ClaimsIdentity identity = new ClaimsIdentity(new GenericIdentity(model.Account, "Token"),
                                                         new[]
            {
                //new Claim("IsValidAuthorized", "true"),
                new Claim("Uid", _user.Account),
                new Claim("Account", _user.Account),
                new Claim("Username", _user.Name),
            }.Concat(role_claim));

            #endregion

            #region #3 發放 Token

            //設定 Token 記載內容
            double unixEpocDate = Math.Round((_jwtOptions.IssueAt.ToUniversalTime() - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero)).TotalSeconds);
            var    claims       = new List <Claim>()
            {
                new Claim(JwtRegisteredClaimNames.Aud, model.ClientId),
                new Claim(JwtRegisteredClaimNames.Sub, model.Account),
                new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
                new Claim(JwtRegisteredClaimNames.Iat, unixEpocDate.ToString(), ClaimValueTypes.Integer64),
            };
            claims.AddRange(identity.Claims);

            //生成 Jwt token, 並進行編碼
            var jwt = new JwtSecurityToken(
                issuer: _jwtOptions.Issuer,
                claims: claims,
                notBefore: _jwtOptions.NotBefore,
                expires: _jwtOptions.Expiration,
                signingCredentials: _jwtOptions.SigningCredentials
                );
            string encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);

            //回傳 Token
            var response = new { access_token = encodedJwt, token_type = "bearer", expires_in = (int)_jwtOptions.ValidFor.TotalSeconds };
            return(new OkObjectResult(response));

            #endregion
        }