public ActionResult AuthCallback(string code) { var result = new AccountValidationVM(); string vtype = RouteData.Values["id"]?.ToString().ToLower(); try { //唯一标示 string openId = string.Empty; try { switch (vtype) { case "qq": { //获取 access_token var accessToken_ResultEntity = QQ.AccessToken(new QQ_AccessToken_RequestEntity() { code = code }); //获取 OpendId var openId_ResultEntity = QQ.OpenId(new QQ_OpenId_RequestEntity() { access_token = accessToken_ResultEntity.access_token }); //获取 UserInfo var openId_Get_User_Info_ResultEntity = QQ.OpenId_Get_User_Info(new QQ_OpenAPI_RequestEntity() { access_token = accessToken_ResultEntity.access_token, openid = openId_ResultEntity.openid }); //身份唯一标识 openId = openId_ResultEntity.openid; } break; case "weibo": { //获取 access_token var accessToken_ResultEntity = Weibo.AccessToken(new Weibo_AccessToken_RequestEntity() { code = code }); //获取 access_token 的授权信息 var tokenInfo_ResultEntity = Weibo.GetTokenInfo(new Weibo_GetTokenInfo_RequestEntity() { access_token = accessToken_ResultEntity.access_token }); //获取 users/show var userShow_ResultEntity = Weibo.UserShow(new Weibo_UserShow_RequestEntity() { access_token = accessToken_ResultEntity.access_token, uid = Convert.ToInt64(tokenInfo_ResultEntity.uid) }); openId = accessToken_ResultEntity.access_token; } break; case "github": { //获取 access_token var accessToken_ResultEntity = GitHub.AccessToken(new GitHub_AccessToken_RequestEntity() { code = code }); //获取 user var user_ResultEntity = GitHub.User(new GitHub_User_RequestEntity() { access_token = accessToken_ResultEntity.access_token }); openId = user_ResultEntity.id.ToString(); } break; case "taobao": { //获取 access_token var accessToken_ResultEntity = Taobao.AccessToken(new Taobao_AccessToken_RequestEntity() { code = code }); openId = accessToken_ResultEntity.open_uid; } break; case "microsoft": { //获取 access_token var accessToken_ResultEntity = MicroSoft.AccessToken(new MicroSoft_AccessToken_RequestEntity() { code = code }); //获取 user var user_ResultEntity = MicroSoft.User(new MicroSoft_User_RequestEntity() { access_token = accessToken_ResultEntity.access_token }); openId = user_ResultEntity.id.ToString(); } break; } } catch (Exception ex) { result.message = ex.Message; } if (string.IsNullOrWhiteSpace(openId)) { result.message = "身份验证失败"; } else { //判断是绑定操作 bool isbind = false; if (User.Identity.IsAuthenticated) { var aboa = Request.Cookies["AccountBindOAuth"]?.Value; if (!string.IsNullOrWhiteSpace(aboa) && (DateTime.Now - DateTime.Parse(aboa)).TotalSeconds < 120) { string uid = Func.Common.GetLoginUserInfo().UserId; using (var db = new ContextBase()) { var sysauth = db.SysAuthorize.Where(x => x.SuId == uid).FirstOrDefault(); var isadd = sysauth == null; //新增 if (isadd) { sysauth = new SysAuthorize() { SaId = Guid.NewGuid().ToString(), SuId = uid }; } switch (vtype) { case "qq": sysauth.OpenId1 = openId; break; case "weibo": sysauth.OpenId2 = openId; break; case "github": sysauth.OpenId3 = openId; break; case "taobao": sysauth.OpenId4 = openId; break; case "microsoft": sysauth.OpenId5 = openId; break; } if (isadd) { db.SysAuthorize.Add(sysauth); } else { db.SysAuthorize.Update(sysauth, db); } db.SaveChanges(); } Response.Cookies.Remove("AccountBindOAuth"); isbind = true; result.code = 301; result.message = "绑定成功"; result.url = "/"; } } //非绑定操作 if (!isbind) { using (var db = new ContextBase()) { SysUser vmo = null; switch (vtype) { case "qq": vmo = (from a in db.SysAuthorize join b in db.SysUser on a.SuId equals b.SuId where a.OpenId1 == openId select b).FirstOrDefault(); break; case "weibo": vmo = (from a in db.SysAuthorize join b in db.SysUser on a.SuId equals b.SuId where a.OpenId2 == openId select b).FirstOrDefault(); break; case "github": vmo = (from a in db.SysAuthorize join b in db.SysUser on a.SuId equals b.SuId where a.OpenId3 == openId select b).FirstOrDefault(); break; case "taobao": vmo = (from a in db.SysAuthorize join b in db.SysUser on a.SuId equals b.SuId where a.OpenId4 == openId select b).FirstOrDefault(); break; case "microsoft": vmo = (from a in db.SysAuthorize join b in db.SysUser on a.SuId equals b.SuId where a.OpenId5 == openId select b).FirstOrDefault(); break; } //没关联 if (vmo == null) { result.code = 302; result.message = "未关联账号,先账号密码登录再关联才能使用"; } else { result = LoginValidation(vmo, "_pass_", 1); } } } } } catch (Exception ex) { result.message = ex.Message; } //成功 if (result.code == 100) { return(Redirect(result.url)); } else { return(View(result)); } }
private AccountValidationVM LoginValidation(SysUser mo, string captcha, int remember) { var result = new AccountValidationVM(); var outMo = new SysUser(); bool isRemember = remember == 1; //跳过验证码 if (captcha == "_pass_") { outMo = mo; } else { var capt = Request.Cookies["captcha"]?.Value; if (string.IsNullOrWhiteSpace(captcha) || (capt ?? "") != Core.CalcTo.MD5(captcha.ToLower())) { result.code = 104; result.message = "验证码错误或已过期"; return(result); } if (string.IsNullOrWhiteSpace(mo.SuName) || string.IsNullOrWhiteSpace(mo.SuPwd)) { result.code = 101; result.message = "用户名或密码不能为空"; return(result); } using (var db = new ContextBase()) { var log = db.SysLog.ToList(); mo.SuPwd = Core.CalcTo.MD5(mo.SuPwd); outMo = db.SysUser.Where(x => x.SuName == mo.SuName && x.SuPwd == mo.SuPwd).FirstOrDefault(); } } if (outMo == null || string.IsNullOrWhiteSpace(outMo.SuId)) { result.code = 102; result.message = "用户名或密码错误"; return(result); } if (outMo.SuStatus != 1) { result.code = 103; result.message = "用户已被禁止登录"; return(result); } try { #region 授权访问信息 var lu = new LoginUserVM() { RoleId = outMo.SrId, UserId = outMo.SuId, UserName = outMo.SuName, Nickname = outMo.SuNickname }; HttpCookie hc = new HttpCookie("__AUTH") { Value = Core.CalcTo.EnDES(lu.ToJson(), "netnr") }; if (isRemember) { hc.Expires = DateTime.Now.AddDays(5); } Response.Cookies.Add(hc); //登录票据 FormsAuthentication.SetAuthCookie(outMo.SuId, isRemember); result.code = 100; result.message = "登录成功"; result.url = "/"; return(result); #endregion } catch (Exception ex) { result.code = 105; result.message = "处理登录请求出错(" + ex.Message + ")"; return(result); } }
public async Task <AccountValidationVM> LoginValidation(SysUser mo, string captcha, int remember) { var result = new AccountValidationVM(); if (string.IsNullOrWhiteSpace(captcha) || !new Func.Session(HttpContext).TryGetValue("captcha", out string capt) || capt.ToLower() != captcha.ToLower()) { result.code = 104; result.message = "验证码错误或已过期"; return(result); } var outMo = new SysUser(); if (string.IsNullOrWhiteSpace(mo.UserName) || string.IsNullOrWhiteSpace(mo.UserPwd)) { result.code = 101; result.message = "用户名或密码不能为空"; return(result); } else { using (var db = new ContextBase()) { outMo = db.SysUser.Where(x => x.UserName == mo.UserName && x.UserPwd == Core.CalcTo.MD5(mo.UserPwd, 32)).FirstOrDefault(); } } if (outMo == null || string.IsNullOrWhiteSpace(outMo.Id)) { result.code = 102; result.message = "用户名或密码错误"; return(result); } if (outMo.Status != 1) { result.code = 103; result.message = "用户已被禁止登录"; return(result); } try { #region 授权访问信息 //登录信息 var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme); identity.AddClaim(new Claim(ClaimTypes.Sid, outMo.Id)); identity.AddClaim(new Claim(ClaimTypes.Name, outMo.UserName)); identity.AddClaim(new Claim(ClaimTypes.GivenName, outMo.Nickname ?? "")); identity.AddClaim(new Claim(ClaimTypes.Role, outMo.RoleId)); //取值 //HttpContext.User.FindFirstValue(ClaimTypes.Sid); //配置 var authParam = new AuthenticationProperties(); if (remember == 1) { authParam.IsPersistent = true; authParam.ExpiresUtc = DateTime.Now.AddDays(10); } //写入 await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), authParam); result.code = 100; result.message = "登录成功"; result.url = "/"; return(result); #endregion } catch (Exception ex) { result.code = 105; result.message = "处理登录请求出错(" + ex.Message + ")"; return(result); } }