public async Task<ActionResult> Logout() { using (var db = new GitTimeContext()) { var accessTokens = await db.AccessTokens.Where(t => t.ContactID == GitTimeUser.Current.ID).ToArrayAsync(); foreach (var accessToken in accessTokens) db.AccessTokens.Remove(accessToken); await db.SaveChangesAsync(); } Session.Abandon(); FormsAuthentication.SignOut(); return Redirect(FormsAuthentication.LoginUrl); }
public async Task<ActionResult> Index(LoginModel model) { if (!ModelState.IsValid) return Error(model, "Email and password are required fields."); using (var db = new GitTimeContext()) { var user = await GetUser(db, model.Email); if (user == null || !String.Equals(model.Password, user.Password)) return Error(model, "Incorrect email or password."); } FormsAuthentication.SetAuthCookie(model.Email, model.RememberMe); GitHubUser.Reload(); return RedirectToAction("Index", "Home"); }
public async static Task<GitTimeUser> Open(String email) { GitTimeUser user = null; if (!String.IsNullOrEmpty(email)) { using (var db = new GitTimeContext()) { var contact = await ( db.Persons .Where(c => c.Email == email) .Select(c => c) ).AsNoTracking().FirstOrDefaultAsync(); user = new GitTimeUser(contact); } } return user ?? new GitTimeUser(null); }
private async static Task<GitHubUser> LoadUserAsync(Int32 userId) { var result = new GitHubUser(); using (var db = new GitTimeContext()) { var token = await db.AccessTokens.Where(t => t.ContactID == userId && t.Application == "GitHub").SingleOrDefaultAsync(); if (token != null) { var userInfo = await GitHubHelper.RequestUserInfoAsync(token); if (userInfo != null) { result.ID = userInfo.ID; result.Name = userInfo.LoginName; result.Email = userInfo.Email; result.AvatarUrl = userInfo.AvatarUrl; result.IsAuthenticated = true; result.AccessToken = token; } } } return result; }
private async static Task SaveAccessToken(GitTimeContext db, AccessToken accessToken) { var dbAccessToken = await db.AccessTokens.Where(a => a.ContactID == accessToken.ContactID && a.Application == accessToken.Application).SingleOrDefaultAsync(); if (dbAccessToken != null) { dbAccessToken.Key = accessToken.Key; dbAccessToken.UtcCreated = accessToken.UtcCreated; } else { db.AccessTokens.Add(accessToken); } await db.SaveChangesAsync(); }
private async static Task<Person> GetUser(GitTimeContext db, String email) { return await (db.Persons.Where(p => p.Email == email).Select(p => p)).AsNoTracking().FirstOrDefaultAsync(); }
public async Task<ActionResult> GitHubAuthorization(String code, String state, String error, String error_description, String error_uri) { String errorMessage = null; if (String.IsNullOrEmpty(error)) { try { AccessToken accessToken = await GitHubHelper.RequestAccessTokenAsync(code, state); if (accessToken != null) { errorMessage = "Your GitHub account is not registered in the system. Please contact the system administrator."; var emails = await GitHubHelper.RequestUserEmailsAsync(accessToken); if (emails != null) { var userEmail = emails.FirstOrDefault(e => e.IsPrimary) ?? emails.FirstOrDefault(); if (userEmail != null && !String.IsNullOrEmpty(userEmail.Email)) { using (var db = new GitTimeContext()) { var user = await GetUser(db, userEmail.Email); if (user != null) { accessToken.ContactID = user.ID; await SaveAccessToken(db, accessToken); FormsAuthentication.SetAuthCookie(user.Email, false); GitHubUser.Reload(); return RedirectToAction("Index", "Home"); } } } } } } catch (GitTimeException gtex) { if (gtex.Message != null) errorMessage = gtex.Message.Replace("\r", String.Empty).Replace("\n", "<br/>"); } } else { errorMessage = String.Format("{0}<br/>Details: {1}", error_description, error_uri); } Session[SessionKeys.ErrorMessage] = errorMessage ?? "An error occurred during authorization through GitHub."; return RedirectToAction("index", new { error = 1 }); }