public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { 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, shouldLockout: false); switch (result) { case SignInStatus.Success: Token token = this.data.Tokens .All() .Where(t => t.UserName == model.Email) .FirstOrDefault(); if(token == null) { var newToken = this.GetNewToken(model); this.data.Tokens.Add(newToken); this.data.SaveChanges(); } else if (this.IsAccessTokenExpired(token)) { token = this.GetNewToken(model); token.ExpireDate = DateTime.Now.AddSeconds(token.ExpiresIn); this.data.Tokens.Update(token); this.data.SaveChanges(); } return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); case SignInStatus.Failure: default: ModelState.AddModelError("", "Invalid login attempt."); return View(model); } }
private Token GetNewToken(LoginViewModel model) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(GlobalConstants.ServerUri + "/Token"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; string postData = "username="******"&password="******"&grant_type=password"; request.ContentLength = postData.Length; var streamWriter = new StreamWriter(request.GetRequestStream()); streamWriter.Write(postData); streamWriter.Close(); var response = request.GetResponse(); var responseBody = new StreamReader(response.GetResponseStream()).ReadToEnd(); Dictionary<string, object> tokenItems = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(responseBody); Token token = new Token(); token.AccessToken = tokenItems["access_token"].ToString(); token.Type = tokenItems["token_type"].ToString(); token.UserName = tokenItems["userName"].ToString(); token.ExpiresIn = (int)tokenItems["expires_in"]; token.ExpireDate = DateTime.Now.AddSeconds(token.ExpiresIn); token.Expires = tokenItems[".expires"].ToString(); token.Issued = tokenItems[".issued"].ToString(); return token; }