Example #1
0
        public async Task <JsonResult> Login(LoginViewModel loginModel, string returnUrl = "Home/Index")
        {
            var result = new AjaxResult();

            try
            {
                var user = await _userManage.GetUserBaseByIncludeAsync(loginModel.UsernameOrPhoneNumber);

                if (user == null)
                {
                    result.Successed = false;
                    result.Message   = "账号不存在";
                    return(Json(result));
                }
                UserBase belongUser;
                if (user.BelongUserId > 0)
                {
                    belongUser = await _userManage.GetUserBaseByIdAsync(user.BelongUserId.Value);
                }
                else
                {
                    belongUser = user;
                }
                //校验密码
                var passwordResult = new PasswordHasher().VerifyHashedPassword(user.PasswordHash, loginModel.Password);
                if (passwordResult != PasswordVerificationResult.Success)
                {
                    result.Message   = "账户名与密码不匹配,请重新输入。";
                    result.Successed = false;
                    return(Json(result));
                }
                //角色信息
                var userRoles = string.Join(",", user.Roles.Where(u => u.IsValid).Select(x => x.Id).ToArray());

                //用户账号类型信息
                var accountTypeObj = user.UserClaims.OrderByDescending(u => u.Id).FirstOrDefault(x => x.ClaimType == "AccountType");

                //会员信息
                var member = await _memberManage.GetMemberByUserBaseIdAsync(belongUser.Id);

                //是否自营
                var isSelfSupport = "false";
                //会员Id
                var memberId = "0";
                //会员代码
                var memberCode = "";
                //公司名称
                var companyName = "";
                //用户类型
                var memberType = "-1";
                if (member != null)
                {
                    memberId    = member.Id.ToString();
                    memberCode  = member.MemberCode ?? "";
                    companyName = member.CompanyName ?? "";
                    memberType  = member.UserType?.ToString() ?? "-1";

                    isSelfSupport = member.IsSelfSupport != null?member.IsSelfSupport.ToString() : "false";
                }

                //构建Claims声明
                var claims = new List <Claim>
                {
                    new Claim(ClaimTypes.Name, user.UserName),                                 //用户名
                    new Claim(ClaimTypes.Role, userRoles),                                     //用户角色集合
                    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),                  //用户Id
                    new Claim(ClaimTypeExtensions.RealName, user.RealName),                    //用户名称,无则为登录名
                    new Claim(ClaimTypeExtensions.AccountType,
                              accountTypeObj == null ? "0" : accountTypeObj.ClaimValue),       //用户帐号类型
                    new Claim(ClaimTypeExtensions.BelongUserId,
                              user.BelongUserId == null ? "0" : user.BelongUserId.ToString()), //所属主帐号Id
                    new Claim(ClaimTypeExtensions.MemberId, memberId),                         //会员Id
                    new Claim(ClaimTypeExtensions.MemberType, memberType),                     //会员类型
                    new Claim(ClaimTypeExtensions.MemberCode, memberCode),                     //会员编码
                    new Claim(ClaimTypeExtensions.CompanyName, companyName),                   //公司名称
                    new Claim(ClaimTypeExtensions.IsSelfSupport, isSelfSupport),               //是否自营
                    new Claim(ClaimTypes.MobilePhone, belongUser.PhoneNumber ?? "0"),          //手机号
                    new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider",
                              "ASP.NET Identity")
                };

                //构建身份申明(类似:登机牌,电影票等)
                var claimsIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
                //通过Owin Context获取认证管理
                var owinCtx = HttpContext.GetOwinContext();
                var authenticationManager = owinCtx.Authentication;

                //先退出登出(稳妥的做法)
                authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);

                //再进行登入(将登机牌给保安验证)(本质其实是构建cookie等)
                authenticationManager.SignIn(new Microsoft.Owin.Security.AuthenticationProperties {
                    IsPersistent = false
                }, claimsIdentity);
            }
            catch (Exception e)
            {
                result.Successed = false;
                result.Message   = e.Message;
                return(Json(result));
            }
            return(Json(result));
        }