Example #1
0
        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);
        }
Example #2
0
        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");
        }
Example #3
0
        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);
        }
Example #4
0
        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;
        }
Example #5
0
        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();
        }
Example #6
0
 private async static Task<Person> GetUser(GitTimeContext db, String email)
 {
     return await (db.Persons.Where(p => p.Email == email).Select(p => p)).AsNoTracking().FirstOrDefaultAsync();
 }
Example #7
0
        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 });
        }