public ActionResult ExternalLoginCallback(string returnUrl)
        {
            var result = OAuthWebSecurity.VerifyAuthentication(
                Url.Action("ExternalLoginCallback",
                           new { ReturnUrl = returnUrl }));

            if (!result.IsSuccessful)
            {
                return(Redirect("~/"));
            }

            var salt = ConfigurationManager.AppSettings["SaltOfUserID"];
            Func <string, string> hash = (s) => FormsAuthentication.HashPasswordForStoringInConfigFile(s, "MD5");
            var user = new TeachMeTeachYouSurvey.Models.User {
                UserId         = hash(string.Join("@", salt, result.ProviderUserId, result.Provider)),
                IdProviderName = result.Provider,

                // terrible hack...
                Name = result.Provider != "github" ? result.UserName : result.ExtraData["login"]
            };

            using (var db = new TeachMeTeachYouSurvey.Models.TeachMeTeachYouDB())
            {
                if (db.Users.Find(user.UserId) == null)
                {
                    db.Users.Add(user);
                    db.SaveChanges();
                }
            }

            var cookie = FormsAuthentication.GetAuthCookie(user.Name, false);
            var ticket = FormsAuthentication.Decrypt(cookie.Value);

            ticket.GetType().InvokeMember("_UserData",
                                          BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance,
                                          null, ticket, new object[] { user.UserId });
            cookie.Value = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(cookie);

            return(Redirect("~/"));
        }
        public ActionResult ExternalLoginCallback(string returnUrl)
        {
            var result = OAuthWebSecurity.VerifyAuthentication(
                Url.Action("ExternalLoginCallback",
                new { ReturnUrl = returnUrl }));
            if (!result.IsSuccessful)
            {
                return Redirect("~/");
            }

            var salt = ConfigurationManager.AppSettings["SaltOfUserID"];
            Func<string, string> hash = (s) => FormsAuthentication.HashPasswordForStoringInConfigFile(s, "MD5");
            var user = new TeachMeTeachYouSurvey.Models.User {
                UserId = hash(string.Join("@", salt, result.ProviderUserId, result.Provider)),
                IdProviderName = result.Provider,

                // terrible hack...
                Name = result.Provider != "github" ? result.UserName : result.ExtraData["login"]
            };

            using (var db = new TeachMeTeachYouSurvey.Models.TeachMeTeachYouDB())
            {
                if (db.Users.Find(user.UserId) == null)
                {
                    db.Users.Add(user);
                    db.SaveChanges();
                }
            }

            var cookie = FormsAuthentication.GetAuthCookie(user.Name, false);
            var ticket = FormsAuthentication.Decrypt(cookie.Value);
            ticket.GetType().InvokeMember("_UserData",
                BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance,
                null, ticket, new object[] { user.UserId });
            cookie.Value = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(cookie);

            return Redirect("~/");
        }